feat: notification service

This commit is contained in:
Ilia Denisov
2026-04-22 08:49:45 +02:00
committed by GitHub
parent 5b7593e6f6
commit 32dc29359a
135 changed files with 21828 additions and 130 deletions
@@ -0,0 +1,184 @@
package worker
import (
"context"
"sync"
)
type recordingWorkerTelemetry struct {
mu sync.Mutex
intentOutcomes []intentOutcomeTelemetryRecord
malformedIntents []malformedIntentTelemetryRecord
userEnrichment []userEnrichmentTelemetryRecord
routePublishAttempts []routePublishTelemetryRecord
routeRetries []routeTelemetryRecord
routeDeadLetters []routeDeadLetterTelemetryRecord
}
func (telemetry *recordingWorkerTelemetry) RecordIntentOutcome(_ context.Context, notificationType string, producer string, audienceKind string, outcome string) {
telemetry.mu.Lock()
defer telemetry.mu.Unlock()
telemetry.intentOutcomes = append(telemetry.intentOutcomes, intentOutcomeTelemetryRecord{
notificationType: notificationType,
producer: producer,
audienceKind: audienceKind,
outcome: outcome,
})
}
func (telemetry *recordingWorkerTelemetry) RecordMalformedIntent(_ context.Context, failureCode string, notificationType string, producer string) {
telemetry.mu.Lock()
defer telemetry.mu.Unlock()
telemetry.malformedIntents = append(telemetry.malformedIntents, malformedIntentTelemetryRecord{
failureCode: failureCode,
notificationType: notificationType,
producer: producer,
})
}
func (telemetry *recordingWorkerTelemetry) RecordUserEnrichmentAttempt(_ context.Context, notificationType string, result string) {
telemetry.mu.Lock()
defer telemetry.mu.Unlock()
telemetry.userEnrichment = append(telemetry.userEnrichment, userEnrichmentTelemetryRecord{
notificationType: notificationType,
result: result,
})
}
func (telemetry *recordingWorkerTelemetry) RecordRoutePublishAttempt(_ context.Context, channel string, notificationType string, result string, failureClassification string) {
telemetry.mu.Lock()
defer telemetry.mu.Unlock()
telemetry.routePublishAttempts = append(telemetry.routePublishAttempts, routePublishTelemetryRecord{
channel: channel,
notificationType: notificationType,
result: result,
failureClassification: failureClassification,
})
}
func (telemetry *recordingWorkerTelemetry) RecordRouteRetry(_ context.Context, channel string, notificationType string) {
telemetry.mu.Lock()
defer telemetry.mu.Unlock()
telemetry.routeRetries = append(telemetry.routeRetries, routeTelemetryRecord{
channel: channel,
notificationType: notificationType,
})
}
func (telemetry *recordingWorkerTelemetry) RecordRouteDeadLetter(_ context.Context, channel string, notificationType string, failureClassification string) {
telemetry.mu.Lock()
defer telemetry.mu.Unlock()
telemetry.routeDeadLetters = append(telemetry.routeDeadLetters, routeDeadLetterTelemetryRecord{
channel: channel,
notificationType: notificationType,
failureClassification: failureClassification,
})
}
func (telemetry *recordingWorkerTelemetry) hasIntentOutcome(outcome string) bool {
telemetry.mu.Lock()
defer telemetry.mu.Unlock()
for _, record := range telemetry.intentOutcomes {
if record.outcome == outcome {
return true
}
}
return false
}
func (telemetry *recordingWorkerTelemetry) hasMalformedIntent(failureCode string) bool {
telemetry.mu.Lock()
defer telemetry.mu.Unlock()
for _, record := range telemetry.malformedIntents {
if record.failureCode == failureCode {
return true
}
}
return false
}
func (telemetry *recordingWorkerTelemetry) hasRoutePublishAttempt(channel string, result string, failureClassification string) bool {
telemetry.mu.Lock()
defer telemetry.mu.Unlock()
for _, record := range telemetry.routePublishAttempts {
if record.channel == channel && record.result == result && record.failureClassification == failureClassification {
return true
}
}
return false
}
func (telemetry *recordingWorkerTelemetry) hasRouteRetry(channel string) bool {
telemetry.mu.Lock()
defer telemetry.mu.Unlock()
for _, record := range telemetry.routeRetries {
if record.channel == channel {
return true
}
}
return false
}
func (telemetry *recordingWorkerTelemetry) hasRouteDeadLetter(channel string, failureClassification string) bool {
telemetry.mu.Lock()
defer telemetry.mu.Unlock()
for _, record := range telemetry.routeDeadLetters {
if record.channel == channel && record.failureClassification == failureClassification {
return true
}
}
return false
}
type intentOutcomeTelemetryRecord struct {
notificationType string
producer string
audienceKind string
outcome string
}
type malformedIntentTelemetryRecord struct {
failureCode string
notificationType string
producer string
}
type userEnrichmentTelemetryRecord struct {
notificationType string
result string
}
type routePublishTelemetryRecord struct {
channel string
notificationType string
result string
failureClassification string
}
type routeTelemetryRecord struct {
channel string
notificationType string
}
type routeDeadLetterTelemetryRecord struct {
channel string
notificationType string
failureClassification string
}