@@ -5,34 +5,25 @@ import (
55 "encoding/json"
66 "errors"
77 "fmt"
8- "io"
98 "log/slog"
10- "net"
119 "slices"
1210 "strings"
1311 "time"
1412
15- "github.com/ClickHouse/clickhouse-go/v2"
16- "github.com/go-mysql-org/go-mysql/mysql"
1713 "github.com/jackc/pgx/v5"
18- "github.com/jackc/pgx/v5/pgconn"
19- "go.mongodb.org/mongo-driver/v2/x/mongo/driver"
2014 "go.opentelemetry.io/otel/attribute"
2115 "go.opentelemetry.io/otel/metric"
22- "golang.org/x/crypto/ssh"
2316
2417 "github.com/PeerDB-io/peerdb/flow/generated/protos"
2518 "github.com/PeerDB-io/peerdb/flow/internal"
2619 "github.com/PeerDB-io/peerdb/flow/otel_metrics"
2720 "github.com/PeerDB-io/peerdb/flow/shared"
28- "github.com/PeerDB-io/peerdb/flow/shared/telemetry"
2921)
3022
3123// alerting service, no cool name :(
3224type Alerter struct {
3325 shared.CatalogPool
34- snsTelemetrySender telemetry.Sender
35- otelManager * otel_metrics.OtelManager
26+ otelManager * otel_metrics.OtelManager
3627}
3728
3829type AlertSenderConfig struct {
@@ -48,27 +39,13 @@ type AlertKeys struct {
4839}
4940
5041// doesn't take care of closing pool, needs to be done externally.
51- func NewAlerter (ctx context.Context , catalogPool shared.CatalogPool , otelManager * otel_metrics.OtelManager ) * Alerter {
42+ func NewAlerter (_ context.Context , catalogPool shared.CatalogPool , otelManager * otel_metrics.OtelManager ) * Alerter {
5243 if catalogPool .Pool == nil {
5344 panic ("catalog pool is nil for Alerter" )
5445 }
55- snsTopic := internal .PeerDBTelemetryAWSSNSTopicArn ()
56- var snsMessageSender telemetry.Sender
57- if snsTopic != "" {
58- var err error
59- snsMessageSender , err = telemetry .NewSNSMessageSenderWithNewClient (ctx , & telemetry.SNSMessageSenderConfig {
60- Topic : snsTopic ,
61- })
62- internal .LoggerFromCtx (ctx ).Info ("Successfully registered sns telemetry sender" )
63- if err != nil {
64- panic (fmt .Sprintf ("unable to setup telemetry is nil for Alerter %+v" , err ))
65- }
66- }
67-
6846 return & Alerter {
69- CatalogPool : catalogPool ,
70- snsTelemetrySender : snsMessageSender ,
71- otelManager : otelManager ,
47+ CatalogPool : catalogPool ,
48+ otelManager : otelManager ,
7249 }
7350}
7451
@@ -350,71 +327,6 @@ func (a *Alerter) checkAndAddAlertToCatalog(ctx context.Context, alertConfigId i
350327 return false
351328}
352329
353- func (a * Alerter ) sendTelemetryMessage (
354- ctx context.Context ,
355- flowName string ,
356- more string ,
357- level telemetry.Level ,
358- additionalTags ... string ,
359- ) {
360- logger := internal .LoggerFromCtx (ctx )
361- allTags := []string {flowName , internal .PeerDBDeploymentUID ()}
362- allTags = append (allTags , additionalTags ... )
363-
364- if flowTags , err := GetTags (ctx , a .CatalogPool , flowName ); err != nil {
365- logger .Warn ("failed to get flow tags" , slog .Any ("error" , err ))
366- } else {
367- for key , value := range flowTags {
368- allTags = append (allTags , fmt .Sprintf ("%s:%s" , key , value ))
369- }
370- }
371-
372- details := fmt .Sprintf ("[%s] %s" , flowName , more )
373- attributes := telemetry.Attributes {
374- Level : level ,
375- DeploymentUID : internal .PeerDBDeploymentUID (),
376- Tags : allTags ,
377- Type : flowName ,
378- }
379-
380- if a .snsTelemetrySender != nil {
381- if response , err := a .snsTelemetrySender .SendMessage (ctx , details , details , attributes ); err != nil {
382- logger .Warn ("failed to send message to snsTelemetrySender" , slog .Any ("error" , err ))
383- } else {
384- logger .Debug ("received response from snsTelemetrySender" , slog .String ("response" , response ))
385- }
386- }
387- }
388-
389- func (a * Alerter ) emitNonFlowTelemetryEvent (
390- ctx context.Context , eventType telemetry.EventType , key string , message string , level telemetry.Level ,
391- ) {
392- a .sendTelemetryMessage (ctx , string (eventType )+ ":" + key , message , level )
393- }
394-
395- // Wrapper for different telemetry levels for non-flow events
396- func (a * Alerter ) EmitNonFlowInfoTelemetryEvent (ctx context.Context , eventType telemetry.EventType , key string , message string ) {
397- a .emitNonFlowTelemetryEvent (ctx , eventType , key , message , telemetry .INFO )
398- }
399-
400- func (a * Alerter ) EmitNonFlowWarningTelemetryEvent (ctx context.Context , eventType telemetry.EventType , key string , message string ) {
401- a .emitNonFlowTelemetryEvent (ctx , eventType , key , message , telemetry .WARN )
402- }
403-
404- func (a * Alerter ) EmitNonFlowErrorTelemetryEvent (ctx context.Context , eventType telemetry.EventType , key string , message string ) {
405- a .emitNonFlowTelemetryEvent (ctx , eventType , key , message , telemetry .ERROR )
406- }
407-
408- func (a * Alerter ) EmitNonFlowCriticalTelemetryEvent (ctx context.Context , eventType telemetry.EventType , key string , message string ) {
409- a .emitNonFlowTelemetryEvent (ctx , eventType , key , message , telemetry .CRITICAL )
410- }
411-
412- func (a * Alerter ) EmitFlowInfoTelemetryEvent (ctx context.Context , flowName string , info string ) {
413- logger := internal .LoggerFromCtx (ctx )
414- logger .Info (info )
415- a .sendTelemetryMessage (ctx , flowName , info , telemetry .INFO )
416- }
417-
418330type FlowErrorType string
419331
420332func (f FlowErrorType ) String () string {
@@ -427,7 +339,7 @@ const (
427339 FlowErrorTypeError FlowErrorType = "error"
428340)
429341
430- // recordFlowErrorInternal pushes the error to the errors table and emits a metric as well as a telemetry message .
342+ // recordFlowErrorInternal pushes the error to the errors table and emits a metric.
431343func (a * Alerter ) recordFlowErrorInternal (
432344 ctx context.Context ,
433345 flowName string ,
@@ -460,42 +372,7 @@ func (a *Alerter) recordFlowErrorInternal(
460372 logger .Error ("failed to insert flow error" , slog .Any ("error" , err ))
461373 }
462374
463- // 3. Only send alerts to telemetry sender if the env is enabled
464- if internal .PeerDBTelemetrySenderSendErrorAlertsEnabled (ctx ) {
465- var tags []string
466- if errors .Is (err , context .Canceled ) {
467- tags = append (tags , string (shared .ErrTypeCanceled ))
468- }
469- if errors .Is (err , io .EOF ) || errors .Is (err , io .ErrUnexpectedEOF ) {
470- tags = append (tags , string (shared .ErrTypeEOF ))
471- }
472- if errors .Is (err , net .ErrClosed ) || strings .HasSuffix (err .Error (), "use of closed network connection" ) {
473- tags = append (tags , string (shared .ErrTypeClosed ))
474- }
475- if pgErr , ok := errors.AsType [* pgconn.PgError ](err ); ok {
476- tags = append (tags , "pgcode:" + pgErr .Code )
477- }
478- if myErr , ok := errors.AsType [* mysql.MyError ](err ); ok {
479- tags = append (tags , fmt .Sprintf ("mycode:%d" , myErr .Code ), "mystate:" + myErr .State )
480- }
481- if mongoErr , ok := errors.AsType [* driver.Error ](err ); ok {
482- tags = append (tags , fmt .Sprintf ("mongocode:%d" , mongoErr .Code ))
483- }
484- if chErr , ok := errors.AsType [* clickhouse.Exception ](err ); ok {
485- tags = append (tags , fmt .Sprintf ("chcode:%d" , chErr .Code ))
486- }
487- if _ , ok := errors.AsType [* net.OpError ](err ); ok {
488- tags = append (tags , string (shared .ErrTypeNet ))
489- }
490- // For SSH connection errors, we currently tag them as "err:Net"
491- if _ , ok := errors.AsType [* ssh.OpenChannelError ](err ); ok {
492- tags = append (tags , string (shared .ErrTypeNet ))
493- }
494- tags = append (tags , "errorClass:" + errClass .String (), "errorAction:" + errClass .ErrorAction ().String ())
495- a .sendTelemetryMessage (ctx , flowName , errMessage , telemetry .ERROR , tags ... )
496- }
497-
498- // 4. Record error metrics
375+ // 3. Record error metrics
499376 errorAttributes := []attribute.KeyValue {
500377 attribute .Stringer (otel_metrics .ErrorClassKey , errClass ),
501378 attribute .Stringer (otel_metrics .ErrorActionKey , errClass .ErrorAction ()),
0 commit comments