@@ -2,6 +2,7 @@ package mysql
22
33import (
44 "context"
5+ "crypto/sha256"
56 "database/sql"
67 "fmt"
78 "net/http"
@@ -34,7 +35,7 @@ import (
3435
3536const name = "database_observability.mysql"
3637
37- const selectServerInfo = `SELECT @@server_uuid, VERSION()`
38+ const selectServerInfo = `SELECT @@server_uuid, @@hostname, VERSION()`
3839
3940func init () {
4041 component .Register (component.Registration {
@@ -314,12 +315,15 @@ func (c *Component) Update(args component.Arguments) error {
314315 return nil
315316 }
316317
317- var serverUUID , engineVersion string
318- if err := rs .Scan (& serverUUID , & engineVersion ); err != nil {
318+ var serverUUID , hostname , engineVersion string
319+ if err := rs .Scan (& serverUUID , & hostname , & engineVersion ); err != nil {
319320 c .reportError ("failed to scan engine version" , err )
320321 return nil
321322 }
322323
324+ // Generate server_id hash from server_uuid and hostname, similar to Postgres collector
325+ generatedServerID := fmt .Sprintf ("%x" , sha256 .Sum256 ([]byte (fmt .Sprintf ("%s:%s" , serverUUID , hostname ))))
326+
323327 var parsedEngineVersion semver.Version
324328 matches := versionRegex .FindStringSubmatch (engineVersion )
325329 if len (matches ) > 1 {
@@ -334,7 +338,7 @@ func (c *Component) Update(args component.Arguments) error {
334338 targets := make ([]discovery.Target , 0 , len (c .args .Targets )+ 1 )
335339 for _ , t := range c .args .Targets {
336340 builder := discovery .NewTargetBuilderFrom (t )
337- if relabel .ProcessBuilder (builder , database_observability .GetRelabelingRules (serverUUID )... ) {
341+ if relabel .ProcessBuilder (builder , database_observability .GetRelabelingRules (generatedServerID )... ) {
338342 targets = append (targets , builder .Target ())
339343 }
340344 }
@@ -348,7 +352,7 @@ func (c *Component) Update(args component.Arguments) error {
348352 }
349353 c .collectors = nil
350354
351- if err := c .startCollectors (serverUUID , engineVersion , parsedEngineVersion ); err != nil {
355+ if err := c .startCollectors (generatedServerID , engineVersion , parsedEngineVersion ); err != nil {
352356 c .reportError ("failed to start collectors" , err )
353357 return nil
354358 }
@@ -383,7 +387,7 @@ func enableOrDisableCollectors(a Arguments) map[string]bool {
383387}
384388
385389// startCollectors attempts to start all of the enabled collectors. If one or more collectors fail to start, their errors are reported
386- func (c * Component ) startCollectors (serverUUID string , engineVersion string , parsedEngineVersion semver.Version ) error {
390+ func (c * Component ) startCollectors (serverID string , engineVersion string , parsedEngineVersion semver.Version ) error {
387391 var startErrors []string
388392
389393 logStartError := func (collectorName , action string , err error ) {
@@ -405,7 +409,7 @@ func (c *Component) startCollectors(serverUUID string, engineVersion string, par
405409 }
406410 }
407411
408- entryHandler := addLokiLabels (loki .NewEntryHandler (c .handler .Chan (), func () {}), c .instanceKey , serverUUID )
412+ entryHandler := addLokiLabels (loki .NewEntryHandler (c .handler .Chan (), func () {}), c .instanceKey , serverID )
409413
410414 collectors := enableOrDisableCollectors (c .args )
411415
@@ -616,11 +620,11 @@ func formatDSN(dsn string, params ...string) string {
616620 return dsn + strings .Join (params , "&" )
617621}
618622
619- func addLokiLabels (entryHandler loki.EntryHandler , instanceKey string , serverUUID string ) loki.EntryHandler {
623+ func addLokiLabels (entryHandler loki.EntryHandler , instanceKey string , serverID string ) loki.EntryHandler {
620624 entryHandler = loki .AddLabelsMiddleware (model.LabelSet {
621625 "job" : database_observability .JobName ,
622626 "instance" : model .LabelValue (instanceKey ),
623- "server_id" : model .LabelValue (serverUUID ),
627+ "server_id" : model .LabelValue (serverID ),
624628 }).Wrap (entryHandler )
625629
626630 return entryHandler
0 commit comments