Skip to content

Commit c1ed343

Browse files
committed
Create metric and queryMetrics structs for unmarshalling queries.
1 parent 7bc0c03 commit c1ed343

File tree

2 files changed

+58
-54
lines changed

2 files changed

+58
-54
lines changed

internal/collector/postgres_metrics.go

Lines changed: 49 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,26 @@ var gtePG16 json.RawMessage
3838
//go:embed "generated/lt_pg16_metrics.json"
3939
var ltPG16 json.RawMessage
4040

41+
type queryMetrics struct {
42+
Metrics []*metric `json:"metrics"`
43+
Query string `json:"sql"`
44+
}
45+
46+
type metric struct {
47+
Aggregation string `json:"aggregation,omitempty"`
48+
AttributeColumns []string `json:"attribute_columns,omitempty"`
49+
DataType string `json:"data_type,omitempty"`
50+
Description string `json:"description,omitempty"`
51+
MetricName string `json:"metric_name"`
52+
Monotonic bool `json:"monotonic,omitempty"`
53+
StartTsColumn string `json:"start_ts_column,omitempty"`
54+
StaticAttributes map[string]string `json:"static_attributes,omitempty"`
55+
TsColumn string `json:"ts_column,omitempty"`
56+
Unit string `json:"unit,omitempty"`
57+
ValueColumn string `json:"value_column"`
58+
ValueType string `json:"value_type,omitempty"`
59+
}
60+
4161
func EnablePostgresMetrics(ctx context.Context, inCluster *v1beta1.PostgresCluster, config *Config) {
4262
if feature.Enabled(ctx, feature.OpenTelemetryMetrics) {
4363
log := logging.FromContext(ctx)
@@ -72,8 +92,8 @@ func EnablePostgresMetrics(ctx context.Context, inCluster *v1beta1.PostgresClust
7292
inCluster.Spec.Instrumentation.Metrics.CustomQueries != nil &&
7393
inCluster.Spec.Instrumentation.Metrics.CustomQueries.Remove != nil {
7494

75-
// Convert json to array of maps
76-
var fiveSecondMetricsArr []map[string]any
95+
// Convert json to array of queryMetrics objects
96+
var fiveSecondMetricsArr []queryMetrics
7797
err := json.Unmarshal(fiveSecondMetricsClone, &fiveSecondMetricsArr)
7898
if err != nil {
7999
log.Error(err, "error compiling postgres metrics")
@@ -83,8 +103,8 @@ func EnablePostgresMetrics(ctx context.Context, inCluster *v1beta1.PostgresClust
83103
fiveSecondMetricsArr = removeMetricsFromQueries(
84104
inCluster.Spec.Instrumentation.Metrics.CustomQueries.Remove, fiveSecondMetricsArr)
85105

86-
// Convert json to array of maps
87-
var fiveMinuteMetricsArr []map[string]any
106+
// Convert json to array of queryMetrics objects
107+
var fiveMinuteMetricsArr []queryMetrics
88108
err = json.Unmarshal(fiveMinuteMetricsClone, &fiveMinuteMetricsArr)
89109
if err != nil {
90110
log.Error(err, "error compiling postgres metrics")
@@ -198,48 +218,37 @@ func appendToJSONArray(a1, a2 json.RawMessage) (json.RawMessage, error) {
198218
}
199219

200220
func removeMetricsFromQueries(metricsToRemove []string,
201-
queryMetricsArr []map[string]any,
202-
) []map[string]any {
221+
queryMetricsArr []queryMetrics,
222+
) []queryMetrics {
203223
// Iterate over the metrics that should be removed
204224
Outer:
205225
for _, metricToRemove := range metricsToRemove {
206-
// Iterate over array of query/metrics maps
226+
// Iterate over array of query/metrics objects
207227
for j, queryAndMetrics := range queryMetricsArr {
208-
// Assert that the metrics key in the query/metrics map holds an array
209-
if metricsArr, ok := queryAndMetrics["metrics"].([]any); ok {
210-
// Iterate over the metrics array
211-
for k, metric := range metricsArr {
212-
// Assert that element in the metrics array is a map[string]any
213-
if metricMap, ok := metric.(map[string]any); ok {
214-
// Check to see if the metric_name matches the metricToRemove
215-
if metricMap["metric_name"] == metricToRemove {
216-
// Remove the metric. Since there won't ever be any
217-
// duplicates, we will be exiting this loop early and
218-
// therefore don't care about the order of the metrics
219-
// array.
220-
metricsArr[k] = metricsArr[len(metricsArr)-1]
221-
metricsArr = metricsArr[:len(metricsArr)-1]
222-
queryAndMetrics["metrics"] = metricsArr
223-
224-
// If the metrics array is empty, remove the query/metrics
225-
// map entirely. Again, we don't care about order.
226-
if len(metricsArr) == 0 {
227-
queryMetricsArr[j] = queryMetricsArr[len(queryMetricsArr)-1]
228-
queryMetricsArr = queryMetricsArr[:len(queryMetricsArr)-1]
229-
}
230-
231-
// We found and deleted the metric, so we can continue
232-
// to the next iteration of the Outer loop.
233-
continue Outer
234-
}
235-
} else {
236-
// TODO: What should we do if the assertion fails?
237-
fmt.Printf("%s is not a map[string]any", metric)
228+
// Iterate over the metrics array
229+
metricsArr := queryAndMetrics.Metrics
230+
for k, metric := range metricsArr {
231+
// Check to see if the metric_name matches the metricToRemove
232+
if metric.MetricName == metricToRemove {
233+
// Remove the metric. Since there won't ever be any
234+
// duplicates, we will be exiting this loop early and
235+
// therefore don't care about the order of the metrics
236+
// array.
237+
metricsArr[len(metricsArr)-1], metricsArr[k] = nil, metricsArr[len(metricsArr)-1]
238+
metricsArr = metricsArr[:len(metricsArr)-1]
239+
queryMetricsArr[j].Metrics = metricsArr
240+
241+
// If the metrics array is empty, remove the query/metrics
242+
// map entirely. Again, we don't care about order.
243+
if len(metricsArr) == 0 {
244+
queryMetricsArr[j] = queryMetricsArr[len(queryMetricsArr)-1]
245+
queryMetricsArr = queryMetricsArr[:len(queryMetricsArr)-1]
238246
}
247+
248+
// We found and deleted the metric, so we can continue
249+
// to the next iteration of the Outer loop.
250+
continue Outer
239251
}
240-
} else {
241-
// TODO: What should we do if the assertion fails?
242-
fmt.Printf("%s is not a []any", queryAndMetrics["metrics"])
243252
}
244253
}
245254
}

internal/collector/postgres_metrics_test.go

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import (
1313

1414
func TestRemoveMetricsFromQueries(t *testing.T) {
1515
// Convert json to map
16-
var fiveMinuteMetricsArr []map[string]any
16+
var fiveMinuteMetricsArr []queryMetrics
1717
err := json.Unmarshal(fiveMinuteMetrics, &fiveMinuteMetricsArr)
1818
assert.NilError(t, err)
1919

@@ -54,23 +54,20 @@ func TestRemoveMetricsFromQueries(t *testing.T) {
5454
"sql": "SELECT s.datname AS dbname , s.xact_commit , s.xact_rollback , s.blks_read , s.blks_hit , s.tup_returned , s.tup_fetched , s.tup_inserted , s.tup_updated , s.tup_deleted , s.conflicts , s.temp_files , s.temp_bytes , s.deadlocks FROM pg_catalog.pg_stat_database s JOIN pg_catalog.pg_database d ON d.datname = s.datname WHERE d.datistemplate = false;\n"
5555
}
5656
]`
57-
var sqlMetricsArr []map[string]any
57+
var sqlMetricsArr []queryMetrics
5858
err := json.Unmarshal([]byte(sqlMetricsData), &sqlMetricsArr)
5959
assert.NilError(t, err)
6060

6161
assert.Equal(t, len(sqlMetricsArr), 2)
62-
metricsArr, ok := sqlMetricsArr[1]["metrics"].([]any)
63-
assert.Equal(t, ok, true)
62+
metricsArr := sqlMetricsArr[1].Metrics
6463
assert.Equal(t, len(metricsArr), 2)
6564

6665
refinedSqlMetricsArr := removeMetricsFromQueries([]string{"ccp_stat_database_blks_hit"}, sqlMetricsArr)
6766
assert.Equal(t, len(refinedSqlMetricsArr), 2)
68-
metricsArr, ok = refinedSqlMetricsArr[1]["metrics"].([]any)
69-
assert.Equal(t, ok, true)
67+
metricsArr = refinedSqlMetricsArr[1].Metrics
7068
assert.Equal(t, len(metricsArr), 1)
71-
remainingMetric, ok := metricsArr[0].(map[string]any)
72-
assert.Equal(t, ok, true)
73-
assert.Equal(t, remainingMetric["metric_name"], "ccp_stat_database_blks_read")
69+
remainingMetric := metricsArr[0]
70+
assert.Equal(t, remainingMetric.MetricName, "ccp_stat_database_blks_read")
7471
})
7572

7673
t.Run("DeleteQueryMetricSet", func(t *testing.T) {
@@ -106,20 +103,18 @@ func TestRemoveMetricsFromQueries(t *testing.T) {
106103
"sql": "SELECT s.datname AS dbname , s.xact_commit , s.xact_rollback , s.blks_read , s.blks_hit , s.tup_returned , s.tup_fetched , s.tup_inserted , s.tup_updated , s.tup_deleted , s.conflicts , s.temp_files , s.temp_bytes , s.deadlocks FROM pg_catalog.pg_stat_database s JOIN pg_catalog.pg_database d ON d.datname = s.datname WHERE d.datistemplate = false;\n"
107104
}
108105
]`
109-
var sqlMetricsArr []map[string]any
106+
var sqlMetricsArr []queryMetrics
110107
err := json.Unmarshal([]byte(sqlMetricsData), &sqlMetricsArr)
111108
assert.NilError(t, err)
112109

113110
assert.Equal(t, len(sqlMetricsArr), 2)
114-
metricsArr, ok := sqlMetricsArr[1]["metrics"].([]any)
115-
assert.Equal(t, ok, true)
111+
metricsArr := sqlMetricsArr[1].Metrics
116112
assert.Equal(t, len(metricsArr), 2)
117113

118114
refinedSqlMetricsArr := removeMetricsFromQueries([]string{"ccp_stat_database_blks_hit",
119115
"ccp_stat_database_blks_read"}, sqlMetricsArr)
120116
assert.Equal(t, len(refinedSqlMetricsArr), 1)
121-
metricsArr, ok = sqlMetricsArr[0]["metrics"].([]any)
122-
assert.Equal(t, ok, true)
117+
metricsArr = sqlMetricsArr[0].Metrics
123118
assert.Equal(t, len(metricsArr), 1)
124119
})
125120

0 commit comments

Comments
 (0)