99 "errors"
1010 "fmt"
1111 "log/slog"
12+ "net"
1213 "os"
1314 "strings"
1415 "sync"
@@ -46,11 +47,12 @@ const (
4647type (
4748 // Collector The OTel collector plugin start an embedded OTel collector for metrics collection in the OTel format.
4849 Collector struct {
49- service types.CollectorInterface
50- cancel context.CancelFunc
51- config * config.Config
52- mu * sync.Mutex
53- stopped bool
50+ service types.CollectorInterface
51+ config * config.Config
52+ mu * sync.Mutex
53+ cancel context.CancelFunc
54+ previousNAPSysLogServer string
55+ stopped bool
5456 }
5557)
5658
@@ -86,10 +88,11 @@ func NewCollector(conf *config.Config) (*Collector, error) {
8688 }
8789
8890 return & Collector {
89- config : conf ,
90- service : oTelCollector ,
91- stopped : true ,
92- mu : & sync.Mutex {},
91+ config : conf ,
92+ service : oTelCollector ,
93+ stopped : true ,
94+ mu : & sync.Mutex {},
95+ previousNAPSysLogServer : "" ,
9396 }, nil
9497}
9598
@@ -550,10 +553,12 @@ func (oc *Collector) updateNginxAppProtectTcplogReceivers(nginxConfigContext *mo
550553 oc .config .Collector .Receivers .TcplogReceivers = make (map [string ]* config.TcplogReceiver )
551554 }
552555
553- if nginxConfigContext .NAPSysLogServer != "" {
554- if ! oc .doesTcplogReceiverAlreadyExist (nginxConfigContext .NAPSysLogServer ) {
556+ napSysLogServer := oc .findAvailableSyslogServers (nginxConfigContext .NAPSysLogServers )
557+
558+ if napSysLogServer != "" {
559+ if ! oc .doesTcplogReceiverAlreadyExist (napSysLogServer ) {
555560 oc .config .Collector .Receivers .TcplogReceivers ["nginx_app_protect" ] = & config.TcplogReceiver {
556- ListenAddress : nginxConfigContext . NAPSysLogServer ,
561+ ListenAddress : napSysLogServer ,
557562 Operators : []config.Operator {
558563 // regex captures the priority number from the log line
559564 {
@@ -606,13 +611,13 @@ func (oc *Collector) updateNginxAppProtectTcplogReceivers(nginxConfigContext *mo
606611 }
607612 }
608613
609- tcplogReceiverDeleted := oc .areNapReceiversDeleted (nginxConfigContext )
614+ tcplogReceiverDeleted := oc .areNapReceiversDeleted (napSysLogServer )
610615
611616 return newTcplogReceiverAdded || tcplogReceiverDeleted
612617}
613618
614- func (oc * Collector ) areNapReceiversDeleted (nginxConfigContext * model. NginxConfigContext ) bool {
615- listenAddressesToBeDeleted := oc .configDeletedNapReceivers (nginxConfigContext )
619+ func (oc * Collector ) areNapReceiversDeleted (napSysLogServer string ) bool {
620+ listenAddressesToBeDeleted := oc .configDeletedNapReceivers (napSysLogServer )
616621 if len (listenAddressesToBeDeleted ) != 0 {
617622 delete (oc .config .Collector .Receivers .TcplogReceivers , "nginx_app_protect" )
618623 return true
@@ -621,17 +626,17 @@ func (oc *Collector) areNapReceiversDeleted(nginxConfigContext *model.NginxConfi
621626 return false
622627}
623628
624- func (oc * Collector ) configDeletedNapReceivers (nginxConfigContext * model. NginxConfigContext ) map [string ]bool {
629+ func (oc * Collector ) configDeletedNapReceivers (napSysLogServer string ) map [string ]bool {
625630 elements := make (map [string ]bool )
626631
627632 for _ , tcplogReceiver := range oc .config .Collector .Receivers .TcplogReceivers {
628633 elements [tcplogReceiver .ListenAddress ] = true
629634 }
630635
631- if nginxConfigContext . NAPSysLogServer != "" {
636+ if napSysLogServer != "" {
632637 addressesToDelete := make (map [string ]bool )
633- if ! elements [nginxConfigContext . NAPSysLogServer ] {
634- addressesToDelete [nginxConfigContext . NAPSysLogServer ] = true
638+ if ! elements [napSysLogServer ] {
639+ addressesToDelete [napSysLogServer ] = true
635640 }
636641
637642 return addressesToDelete
@@ -675,6 +680,39 @@ func (oc *Collector) updateResourceAttributes(
675680 return actionUpdated
676681}
677682
683+ func (oc * Collector ) findAvailableSyslogServers (napSyslogServers []string ) string {
684+ napSyslogServersMap := make (map [string ]bool )
685+ for _ , server := range napSyslogServers {
686+ napSyslogServersMap [server ] = true
687+ }
688+
689+ if oc .previousNAPSysLogServer != "" {
690+ if _ , ok := napSyslogServersMap [oc .previousNAPSysLogServer ]; ok {
691+ return oc .previousNAPSysLogServer
692+ }
693+ }
694+
695+ for _ , napSyslogServer := range napSyslogServers {
696+ ln , err := net .Listen ("tcp" , napSyslogServer )
697+ if err != nil {
698+ slog .Debug ("NAP syslog server is not reachable" , "address" , napSyslogServer ,
699+ "error" , err )
700+
701+ continue
702+ }
703+ closeError := ln .Close ()
704+ if closeError != nil {
705+ slog .Debug ("Failed to close syslog server" , "address" , napSyslogServer , "error" , closeError )
706+ }
707+
708+ slog .Debug ("Found valid NAP syslog server" , "address" , napSyslogServer )
709+
710+ return napSyslogServer
711+ }
712+
713+ return ""
714+ }
715+
678716func isOSSReceiverChanged (nginxReceiver config.NginxReceiver , nginxConfigContext * model.NginxConfigContext ) bool {
679717 return nginxReceiver .StubStatus .URL != nginxConfigContext .StubStatus .URL ||
680718 len (nginxReceiver .AccessLogs ) != len (nginxConfigContext .AccessLogs )
0 commit comments