Skip to content

Commit 51107ca

Browse files
authored
db-o11y: change the server_id calculation for mysql (#4943)
* change the server_id calculation for mysql * changelog
1 parent 5f9aeec commit 51107ca

File tree

3 files changed

+21
-13
lines changed

3 files changed

+21
-13
lines changed

CHANGELOG.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,11 @@ Main (unreleased)
2828

2929

3030
- (_Public Preview_) Additions to `database_observability.postgres` component:
31-
- fixes collection of Postgres schema details for mixed case table names (@fridgepoet)
31+
- `schema_details`
32+
- fixes collection of schema details for mixed case table names (@fridgepoet)
33+
34+
- (_Public Preview_) Additions to `database_observability.mysql` component:
35+
- replace the internal `server_id` label attribution in favor of a hash composed from `@@server_uuid` and `@@hostname`
3236

3337
v1.12.0-rc.3
3438
-----------------

internal/component/database_observability/mysql/component.go

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package mysql
22

33
import (
44
"context"
5+
"crypto/sha256"
56
"database/sql"
67
"fmt"
78
"net/http"
@@ -34,7 +35,7 @@ import (
3435

3536
const name = "database_observability.mysql"
3637

37-
const selectServerInfo = `SELECT @@server_uuid, VERSION()`
38+
const selectServerInfo = `SELECT @@server_uuid, @@hostname, VERSION()`
3839

3940
func 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

internal/component/database_observability/mysql/component_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ func Test_addLokiLabels(t *testing.T) {
259259
t.Run("add required labels to loki entries", func(t *testing.T) {
260260
lokiClient := loki.NewCollectingHandler()
261261
defer lokiClient.Stop()
262-
entryHandler := addLokiLabels(lokiClient, "some-instance-key", "some-server-uuid")
262+
entryHandler := addLokiLabels(lokiClient, "some-instance-key", "some-server-id-hash")
263263

264264
go func() {
265265
ts := time.Now().UnixNano()
@@ -279,7 +279,7 @@ func Test_addLokiLabels(t *testing.T) {
279279
assert.Equal(t, model.LabelSet{
280280
"job": database_observability.JobName,
281281
"instance": model.LabelValue("some-instance-key"),
282-
"server_id": model.LabelValue("some-server-uuid"),
282+
"server_id": model.LabelValue("some-server-id-hash"),
283283
}, lokiClient.Received()[0].Labels)
284284
assert.Equal(t, "some-message", lokiClient.Received()[0].Line)
285285
})
@@ -336,7 +336,7 @@ func TestMySQL_StartCollectors_ReportsUnhealthy_StackedErrors(t *testing.T) {
336336
// First ping to the database succeeds, so we can start collectors
337337
mock.ExpectPing()
338338
// Engine info succeeds (if reached)
339-
mock.ExpectQuery(`SELECT @@server_uuid, VERSION\(\)`).WillReturnRows(sqlmock.NewRows([]string{"server_uuid", "version"}).AddRow("uuid-1", "8.0.0"))
339+
mock.ExpectQuery(`SELECT @@server_uuid, @@hostname, VERSION\(\)`).WillReturnRows(sqlmock.NewRows([]string{"server_uuid", "hostname", "version"}).AddRow("uuid-1", "test-hostname", "8.0.0"))
340340
// QuerySample constructor queries uptime and fails
341341
mock.ExpectQuery(regexp.QuoteMeta("SELECT variable_value FROM performance_schema.global_status WHERE variable_name = 'UPTIME'")).
342342
WillReturnRows(sqlmock.NewRows([]string{"variable_value"}).AddRow(1))

0 commit comments

Comments
 (0)