discovery service
This commit is contained in:
@@ -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 == "" {
|
||||
|
||||
Reference in New Issue
Block a user