discovery service

This commit is contained in:
Stephan D
2026-01-02 02:44:01 +01:00
parent 97ba7500dc
commit ea1c69f14a
47 changed files with 2799 additions and 701 deletions

View File

@@ -9,6 +9,7 @@ import (
"github.com/google/uuid"
msg "github.com/tech/sendico/pkg/messaging"
"github.com/tech/sendico/pkg/mlogger"
"go.uber.org/zap"
)
type Announcer struct {
@@ -31,8 +32,11 @@ func NewAnnouncer(logger mlogger.Logger, producer msg.Producer, sender string, a
if announce.Service == "" {
announce.Service = strings.TrimSpace(sender)
}
if announce.InstanceID == "" {
announce.InstanceID = InstanceID()
}
if announce.ID == "" {
announce.ID = DefaultInstanceID(announce.Service)
announce.ID = DefaultEntryID(announce.Service)
}
if announce.InvokeURI == "" && announce.Service != "" {
announce.InvokeURI = DefaultInvokeURI(announce.Service)
@@ -53,15 +57,16 @@ func (a *Announcer) Start() {
}
a.startOnce.Do(func() {
if a.producer == nil {
a.logWarn("Discovery announce skipped: producer not configured")
a.logWarn("Discovery announce skipped: producer not configured", announcementFields(a.announce)...)
close(a.doneCh)
return
}
if strings.TrimSpace(a.announce.ID) == "" {
a.logWarn("Discovery announce skipped: missing instance id")
a.logWarn("Discovery announce skipped: missing instance id", announcementFields(a.announce)...)
close(a.doneCh)
return
}
a.logInfo("Discovery announcer starting", announcementFields(a.announce)...)
a.sendAnnouncement()
a.sendHeartbeat()
go a.heartbeatLoop()
@@ -75,6 +80,7 @@ func (a *Announcer) Stop() {
a.stopOnce.Do(func() {
close(a.stopCh)
<-a.doneCh
a.logInfo("Discovery announcer stopped", announcementFields(a.announce)...)
})
}
@@ -99,42 +105,47 @@ func (a *Announcer) heartbeatLoop() {
func (a *Announcer) sendAnnouncement() {
env := NewServiceAnnounceEnvelope(a.sender, a.announce)
event := ServiceAnnounceEvent()
if a.announce.Rail != "" {
env = NewGatewayAnnounceEnvelope(a.sender, a.announce)
event = GatewayAnnounceEvent()
}
if err := a.producer.SendMessage(env); err != nil {
a.logWarn("Failed to publish discovery announce: " + err.Error())
fields := append(announcementFields(a.announce), zap.String("event", event.ToString()), zap.Error(err))
a.logWarn("Failed to publish discovery announce", fields...)
return
}
a.logInfo("Discovery announce published")
a.logInfo("Discovery announce published", append(announcementFields(a.announce), zap.String("event", event.ToString()))...)
}
func (a *Announcer) sendHeartbeat() {
hb := Heartbeat{
ID: a.announce.ID,
Status: "ok",
TS: time.Now().Unix(),
ID: a.announce.ID,
InstanceID: a.announce.InstanceID,
Status: "ok",
TS: time.Now().Unix(),
}
if err := a.producer.SendMessage(NewHeartbeatEnvelope(a.sender, hb)); err != nil {
a.logWarn("Failed to publish discovery heartbeat: " + err.Error())
fields := append(announcementFields(a.announce), zap.String("event", HeartbeatEvent().ToString()), zap.Error(err))
a.logWarn("Failed to publish discovery heartbeat", fields...)
}
}
func (a *Announcer) logInfo(message string) {
func (a *Announcer) logInfo(message string, fields ...zap.Field) {
if a.logger == nil {
return
}
a.logger.Info(message)
a.logger.Info(message, fields...)
}
func (a *Announcer) logWarn(message string) {
func (a *Announcer) logWarn(message string, fields ...zap.Field) {
if a.logger == nil {
return
}
a.logger.Warn(message)
a.logger.Warn(message, fields...)
}
func DefaultInstanceID(service string) string {
func DefaultEntryID(service string) string {
clean := strings.ToLower(strings.TrimSpace(service))
if clean == "" {
clean = "service"
@@ -148,6 +159,10 @@ func DefaultInstanceID(service string) string {
return clean + "_" + host + "_" + uid
}
func DefaultInstanceID(service string) string {
return DefaultEntryID(service)
}
func DefaultInvokeURI(service string) string {
clean := strings.ToLower(strings.TrimSpace(service))
if clean == "" {