diff --git a/.chloggen/postgresql_deadlocks.yaml b/.chloggen/postgresql_deadlocks.yaml new file mode 100755 index 0000000000000..5547e6a98de83 --- /dev/null +++ b/.chloggen/postgresql_deadlocks.yaml @@ -0,0 +1,27 @@ +# Use this changelog template to create an entry for release notes. + +# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix' +change_type: enhancement + +# The name of the component, or a single word describing the area of concern, (e.g. filelogreceiver) +component: postgresqlreceiver + +# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`). +note: Added `postgresql.deadlocks` metric. + +# Mandatory: One or more tracking issues related to the change. You can use the PR number here if no issue exists. +issues: [25688] + +# (Optional) One or more lines of additional information to render under the primary note. +# These lines will be padded with 2 spaces and then inserted directly into the document. +# Use pipe (|) for multiline entries. +subtext: + +# If your change doesn't affect end users or the exported elements of any package, +# you should instead start your pull request title with [chore] or use the "Skip Changelog" label. +# Optional: The change log or logs in which this entry should be included. +# e.g. '[user]' or '[user, api]' +# Include 'user' if the change is relevant to end users. +# Include 'api' if there is a change to a library API. +# Default: '[user]' +change_logs: [user] diff --git a/receiver/postgresqlreceiver/client.go b/receiver/postgresqlreceiver/client.go index 62c14afa15343..ac2c858718176 100644 --- a/receiver/postgresqlreceiver/client.go +++ b/receiver/postgresqlreceiver/client.go @@ -131,10 +131,11 @@ func (c *postgreSQLClient) Close() error { type databaseStats struct { transactionCommitted int64 transactionRollback int64 + deadlocks int64 } func (c *postgreSQLClient) getDatabaseStats(ctx context.Context, databases []string) (map[databaseName]databaseStats, error) { - query := filterQueryByDatabases("SELECT datname, xact_commit, xact_rollback FROM pg_stat_database", databases, false) + query := filterQueryByDatabases("SELECT datname, xact_commit, xact_rollback, deadlocks FROM pg_stat_database", databases, false) rows, err := c.client.QueryContext(ctx, query) if err != nil { return nil, err @@ -143,8 +144,8 @@ func (c *postgreSQLClient) getDatabaseStats(ctx context.Context, databases []str dbStats := map[databaseName]databaseStats{} for rows.Next() { var datname string - var transactionCommitted, transactionRollback int64 - err = rows.Scan(&datname, &transactionCommitted, &transactionRollback) + var transactionCommitted, transactionRollback, deadlocks int64 + err = rows.Scan(&datname, &transactionCommitted, &transactionRollback, &deadlocks) if err != nil { errs = multierr.Append(errs, err) continue @@ -153,6 +154,7 @@ func (c *postgreSQLClient) getDatabaseStats(ctx context.Context, databases []str dbStats[databaseName(datname)] = databaseStats{ transactionCommitted: transactionCommitted, transactionRollback: transactionRollback, + deadlocks: deadlocks, } } } diff --git a/receiver/postgresqlreceiver/documentation.md b/receiver/postgresqlreceiver/documentation.md index d3ad610c3742a..bc0c448645e33 100644 --- a/receiver/postgresqlreceiver/documentation.md +++ b/receiver/postgresqlreceiver/documentation.md @@ -273,6 +273,30 @@ This metric requires WAL to be enabled with at least one replica. | operation | The operation which is responsible for the lag. | Str: ``flush``, ``replay``, ``write`` | | replication_client | The IP address of the client connected to this backend. If this field is "unix", it indicates either that the client is connected via a Unix socket. | Any Str | +## Optional Metrics + +The following metrics are not emitted by default. Each of them can be enabled by applying the following configuration: + +```yaml +metrics: + : + enabled: true +``` + +### postgresql.deadlocks + +The number of deadlocks. + +| Unit | Metric Type | Value Type | Aggregation Temporality | Monotonic | +| ---- | ----------- | ---------- | ----------------------- | --------- | +| {deadlock} | Sum | Int | Cumulative | true | + +#### Attributes + +| Name | Description | Values | +| ---- | ----------- | ------ | +| database | The name of the database. | Any Str | + ## Resource Attributes | Name | Description | Values | Enabled | diff --git a/receiver/postgresqlreceiver/integration_test.go b/receiver/postgresqlreceiver/integration_test.go index 9235525128e9e..c965384ace1ea 100644 --- a/receiver/postgresqlreceiver/integration_test.go +++ b/receiver/postgresqlreceiver/integration_test.go @@ -58,6 +58,7 @@ func integrationTest(name string, databases []string) func(*testing.T) { rCfg.Username = "otelu" rCfg.Password = "otelp" rCfg.Insecure = true + rCfg.Metrics.PostgresqlDeadlocks.Enabled = true }), scraperinttest.WithExpectedFile(expectedFile), scraperinttest.WithCompareOptions( diff --git a/receiver/postgresqlreceiver/internal/metadata/custom.go b/receiver/postgresqlreceiver/internal/metadata/custom.go index 8710e9ba37948..ec411e8836957 100644 --- a/receiver/postgresqlreceiver/internal/metadata/custom.go +++ b/receiver/postgresqlreceiver/internal/metadata/custom.go @@ -81,6 +81,21 @@ func (m *metricPostgresqlRollbacks) recordDatapointWithoutDatabase(start pcommon dp.SetIntValue(val) } +// RecordPostgresqlDeadlocksDataPointWithoutDatabase adds a data point to postgresql.deadlocks metric without the database metric attribute. +func (mb *MetricsBuilder) RecordPostgresqlDeadlocksDataPointWithoutDatabase(ts pcommon.Timestamp, val int64) { + mb.metricPostgresqlDeadlocks.recordDatapointWithoutDatabase(mb.startTime, ts, val) +} + +func (m *metricPostgresqlDeadlocks) recordDatapointWithoutDatabase(start pcommon.Timestamp, ts pcommon.Timestamp, val int64) { + if !m.config.Enabled { + return + } + dp := m.data.Sum().DataPoints().AppendEmpty() + dp.SetStartTimestamp(start) + dp.SetTimestamp(ts) + dp.SetIntValue(val) +} + // RecordPostgresqlRowsDataPointWithoutDatabaseAndTable adds a data point to postgresql.rows metric without the database or table metric attribute. func (mb *MetricsBuilder) RecordPostgresqlRowsDataPointWithoutDatabaseAndTable(ts pcommon.Timestamp, val int64, stateAttributeValue AttributeState) { mb.metricPostgresqlRows.recordDatapointWithoutDatabaseAndTable(mb.startTime, ts, val, stateAttributeValue.String()) diff --git a/receiver/postgresqlreceiver/internal/metadata/generated_config.go b/receiver/postgresqlreceiver/internal/metadata/generated_config.go index e5fef9752c36e..c5643a772702c 100644 --- a/receiver/postgresqlreceiver/internal/metadata/generated_config.go +++ b/receiver/postgresqlreceiver/internal/metadata/generated_config.go @@ -36,6 +36,7 @@ type MetricsConfig struct { PostgresqlConnectionMax MetricConfig `mapstructure:"postgresql.connection.max"` PostgresqlDatabaseCount MetricConfig `mapstructure:"postgresql.database.count"` PostgresqlDbSize MetricConfig `mapstructure:"postgresql.db_size"` + PostgresqlDeadlocks MetricConfig `mapstructure:"postgresql.deadlocks"` PostgresqlIndexScans MetricConfig `mapstructure:"postgresql.index.scans"` PostgresqlIndexSize MetricConfig `mapstructure:"postgresql.index.size"` PostgresqlOperations MetricConfig `mapstructure:"postgresql.operations"` @@ -84,6 +85,9 @@ func DefaultMetricsConfig() MetricsConfig { PostgresqlDbSize: MetricConfig{ Enabled: true, }, + PostgresqlDeadlocks: MetricConfig{ + Enabled: false, + }, PostgresqlIndexScans: MetricConfig{ Enabled: true, }, diff --git a/receiver/postgresqlreceiver/internal/metadata/generated_config_test.go b/receiver/postgresqlreceiver/internal/metadata/generated_config_test.go index 2b350f921acc8..44317131d3fca 100644 --- a/receiver/postgresqlreceiver/internal/metadata/generated_config_test.go +++ b/receiver/postgresqlreceiver/internal/metadata/generated_config_test.go @@ -37,6 +37,7 @@ func TestMetricsBuilderConfig(t *testing.T) { PostgresqlConnectionMax: MetricConfig{Enabled: true}, PostgresqlDatabaseCount: MetricConfig{Enabled: true}, PostgresqlDbSize: MetricConfig{Enabled: true}, + PostgresqlDeadlocks: MetricConfig{Enabled: true}, PostgresqlIndexScans: MetricConfig{Enabled: true}, PostgresqlIndexSize: MetricConfig{Enabled: true}, PostgresqlOperations: MetricConfig{Enabled: true}, @@ -71,6 +72,7 @@ func TestMetricsBuilderConfig(t *testing.T) { PostgresqlConnectionMax: MetricConfig{Enabled: false}, PostgresqlDatabaseCount: MetricConfig{Enabled: false}, PostgresqlDbSize: MetricConfig{Enabled: false}, + PostgresqlDeadlocks: MetricConfig{Enabled: false}, PostgresqlIndexScans: MetricConfig{Enabled: false}, PostgresqlIndexSize: MetricConfig{Enabled: false}, PostgresqlOperations: MetricConfig{Enabled: false}, diff --git a/receiver/postgresqlreceiver/internal/metadata/generated_metrics.go b/receiver/postgresqlreceiver/internal/metadata/generated_metrics.go index c4e00840a5916..b9a1aa84fdce0 100644 --- a/receiver/postgresqlreceiver/internal/metadata/generated_metrics.go +++ b/receiver/postgresqlreceiver/internal/metadata/generated_metrics.go @@ -812,6 +812,59 @@ func newMetricPostgresqlDbSize(cfg MetricConfig) metricPostgresqlDbSize { return m } +type metricPostgresqlDeadlocks struct { + data pmetric.Metric // data buffer for generated metric. + config MetricConfig // metric config provided by user. + capacity int // max observed number of data points added to the metric. +} + +// init fills postgresql.deadlocks metric with initial data. +func (m *metricPostgresqlDeadlocks) init() { + m.data.SetName("postgresql.deadlocks") + m.data.SetDescription("The number of deadlocks.") + m.data.SetUnit("{deadlock}") + m.data.SetEmptySum() + m.data.Sum().SetIsMonotonic(true) + m.data.Sum().SetAggregationTemporality(pmetric.AggregationTemporalityCumulative) + m.data.Sum().DataPoints().EnsureCapacity(m.capacity) +} + +func (m *metricPostgresqlDeadlocks) recordDataPoint(start pcommon.Timestamp, ts pcommon.Timestamp, val int64, databaseAttributeValue string) { + if !m.config.Enabled { + return + } + dp := m.data.Sum().DataPoints().AppendEmpty() + dp.SetStartTimestamp(start) + dp.SetTimestamp(ts) + dp.SetIntValue(val) + dp.Attributes().PutStr("database", databaseAttributeValue) +} + +// updateCapacity saves max length of data point slices that will be used for the slice capacity. +func (m *metricPostgresqlDeadlocks) updateCapacity() { + if m.data.Sum().DataPoints().Len() > m.capacity { + m.capacity = m.data.Sum().DataPoints().Len() + } +} + +// emit appends recorded metric data to a metrics slice and prepares it for recording another set of data points. +func (m *metricPostgresqlDeadlocks) emit(metrics pmetric.MetricSlice) { + if m.config.Enabled && m.data.Sum().DataPoints().Len() > 0 { + m.updateCapacity() + m.data.MoveTo(metrics.AppendEmpty()) + m.init() + } +} + +func newMetricPostgresqlDeadlocks(cfg MetricConfig) metricPostgresqlDeadlocks { + m := metricPostgresqlDeadlocks{config: cfg} + if cfg.Enabled { + m.data = pmetric.NewMetric() + m.init() + } + return m +} + type metricPostgresqlIndexScans struct { data pmetric.Metric // data buffer for generated metric. config MetricConfig // metric config provided by user. @@ -1399,6 +1452,7 @@ type MetricsBuilder struct { metricPostgresqlConnectionMax metricPostgresqlConnectionMax metricPostgresqlDatabaseCount metricPostgresqlDatabaseCount metricPostgresqlDbSize metricPostgresqlDbSize + metricPostgresqlDeadlocks metricPostgresqlDeadlocks metricPostgresqlIndexScans metricPostgresqlIndexScans metricPostgresqlIndexSize metricPostgresqlIndexSize metricPostgresqlOperations metricPostgresqlOperations @@ -1439,6 +1493,7 @@ func NewMetricsBuilder(mbc MetricsBuilderConfig, settings receiver.CreateSetting metricPostgresqlConnectionMax: newMetricPostgresqlConnectionMax(mbc.Metrics.PostgresqlConnectionMax), metricPostgresqlDatabaseCount: newMetricPostgresqlDatabaseCount(mbc.Metrics.PostgresqlDatabaseCount), metricPostgresqlDbSize: newMetricPostgresqlDbSize(mbc.Metrics.PostgresqlDbSize), + metricPostgresqlDeadlocks: newMetricPostgresqlDeadlocks(mbc.Metrics.PostgresqlDeadlocks), metricPostgresqlIndexScans: newMetricPostgresqlIndexScans(mbc.Metrics.PostgresqlIndexScans), metricPostgresqlIndexSize: newMetricPostgresqlIndexSize(mbc.Metrics.PostgresqlIndexSize), metricPostgresqlOperations: newMetricPostgresqlOperations(mbc.Metrics.PostgresqlOperations), @@ -1522,6 +1577,7 @@ func (mb *MetricsBuilder) EmitForResource(rmo ...ResourceMetricsOption) { mb.metricPostgresqlConnectionMax.emit(ils.Metrics()) mb.metricPostgresqlDatabaseCount.emit(ils.Metrics()) mb.metricPostgresqlDbSize.emit(ils.Metrics()) + mb.metricPostgresqlDeadlocks.emit(ils.Metrics()) mb.metricPostgresqlIndexScans.emit(ils.Metrics()) mb.metricPostgresqlIndexSize.emit(ils.Metrics()) mb.metricPostgresqlOperations.emit(ils.Metrics()) @@ -1608,6 +1664,11 @@ func (mb *MetricsBuilder) RecordPostgresqlDbSizeDataPoint(ts pcommon.Timestamp, mb.metricPostgresqlDbSize.recordDataPoint(mb.startTime, ts, val, databaseAttributeValue) } +// RecordPostgresqlDeadlocksDataPoint adds a data point to postgresql.deadlocks metric. +func (mb *MetricsBuilder) RecordPostgresqlDeadlocksDataPoint(ts pcommon.Timestamp, val int64, databaseAttributeValue string) { + mb.metricPostgresqlDeadlocks.recordDataPoint(mb.startTime, ts, val, databaseAttributeValue) +} + // RecordPostgresqlIndexScansDataPoint adds a data point to postgresql.index.scans metric. func (mb *MetricsBuilder) RecordPostgresqlIndexScansDataPoint(ts pcommon.Timestamp, val int64) { mb.metricPostgresqlIndexScans.recordDataPoint(mb.startTime, ts, val) diff --git a/receiver/postgresqlreceiver/internal/metadata/generated_metrics_test.go b/receiver/postgresqlreceiver/internal/metadata/generated_metrics_test.go index e880b34fe904b..b256e8e7baef6 100644 --- a/receiver/postgresqlreceiver/internal/metadata/generated_metrics_test.go +++ b/receiver/postgresqlreceiver/internal/metadata/generated_metrics_test.go @@ -98,6 +98,9 @@ func TestMetricsBuilder(t *testing.T) { allMetricsCount++ mb.RecordPostgresqlDbSizeDataPoint(ts, 1, "database-val") + allMetricsCount++ + mb.RecordPostgresqlDeadlocksDataPoint(ts, 1, "database-val") + defaultMetricsCount++ allMetricsCount++ mb.RecordPostgresqlIndexScansDataPoint(ts, 1) @@ -347,6 +350,23 @@ func TestMetricsBuilder(t *testing.T) { attrVal, ok := dp.Attributes().Get("database") assert.True(t, ok) assert.EqualValues(t, "database-val", attrVal.Str()) + case "postgresql.deadlocks": + assert.False(t, validatedMetrics["postgresql.deadlocks"], "Found a duplicate in the metrics slice: postgresql.deadlocks") + validatedMetrics["postgresql.deadlocks"] = true + assert.Equal(t, pmetric.MetricTypeSum, ms.At(i).Type()) + assert.Equal(t, 1, ms.At(i).Sum().DataPoints().Len()) + assert.Equal(t, "The number of deadlocks.", ms.At(i).Description()) + assert.Equal(t, "{deadlock}", ms.At(i).Unit()) + assert.Equal(t, true, ms.At(i).Sum().IsMonotonic()) + assert.Equal(t, pmetric.AggregationTemporalityCumulative, ms.At(i).Sum().AggregationTemporality()) + dp := ms.At(i).Sum().DataPoints().At(0) + assert.Equal(t, start, dp.StartTimestamp()) + assert.Equal(t, ts, dp.Timestamp()) + assert.Equal(t, pmetric.NumberDataPointValueTypeInt, dp.ValueType()) + assert.Equal(t, int64(1), dp.IntValue()) + attrVal, ok := dp.Attributes().Get("database") + assert.True(t, ok) + assert.EqualValues(t, "database-val", attrVal.Str()) case "postgresql.index.scans": assert.False(t, validatedMetrics["postgresql.index.scans"], "Found a duplicate in the metrics slice: postgresql.index.scans") validatedMetrics["postgresql.index.scans"] = true diff --git a/receiver/postgresqlreceiver/internal/metadata/testdata/config.yaml b/receiver/postgresqlreceiver/internal/metadata/testdata/config.yaml index d31fb03423cb7..d82b665b4a51f 100644 --- a/receiver/postgresqlreceiver/internal/metadata/testdata/config.yaml +++ b/receiver/postgresqlreceiver/internal/metadata/testdata/config.yaml @@ -23,6 +23,8 @@ all_set: enabled: true postgresql.db_size: enabled: true + postgresql.deadlocks: + enabled: true postgresql.index.scans: enabled: true postgresql.index.size: @@ -76,6 +78,8 @@ none_set: enabled: false postgresql.db_size: enabled: false + postgresql.deadlocks: + enabled: false postgresql.index.scans: enabled: false postgresql.index.size: diff --git a/receiver/postgresqlreceiver/metadata.yaml b/receiver/postgresqlreceiver/metadata.yaml index 7d1ea8119d859..43c34b0988879 100644 --- a/receiver/postgresqlreceiver/metadata.yaml +++ b/receiver/postgresqlreceiver/metadata.yaml @@ -230,6 +230,15 @@ metrics: monotonic: true aggregation_temporality: cumulative attributes: [database] + postgresql.deadlocks: + enabled: false + description: The number of deadlocks. + unit: "{deadlock}" + sum: + value_type: int + monotonic: true + aggregation_temporality: cumulative + attributes: [database] postgresql.table.count: attributes: [] description: Number of user tables in a database. diff --git a/receiver/postgresqlreceiver/scraper.go b/receiver/postgresqlreceiver/scraper.go index e35153428cbfb..f1d3ad5edf47e 100644 --- a/receiver/postgresqlreceiver/scraper.go +++ b/receiver/postgresqlreceiver/scraper.go @@ -165,6 +165,7 @@ func (p *postgreSQLScraper) recordDatabase(now pcommon.Timestamp, db string, r * if stats, ok := r.dbStats[dbName]; ok { p.mb.RecordPostgresqlCommitsDataPointWithoutDatabase(now, stats.transactionCommitted) p.mb.RecordPostgresqlRollbacksDataPointWithoutDatabase(now, stats.transactionRollback) + p.mb.RecordPostgresqlDeadlocksDataPointWithoutDatabase(now, stats.deadlocks) } rb := p.mb.NewResourceBuilder() rb.SetPostgresqlDatabaseName(db) diff --git a/receiver/postgresqlreceiver/scraper_test.go b/receiver/postgresqlreceiver/scraper_test.go index f04e029f9b608..a7380a4511ef2 100644 --- a/receiver/postgresqlreceiver/scraper_test.go +++ b/receiver/postgresqlreceiver/scraper_test.go @@ -37,6 +37,7 @@ func TestScraper(t *testing.T) { cfg := createDefaultConfig().(*Config) cfg.Databases = []string{"otel"} + cfg.Metrics.PostgresqlDeadlocks.Enabled = true scraper := newPostgreSQLScraper(receivertest.NewNopCreateSettings(), cfg, factory) actualMetrics, err := scraper.scrape(context.Background()) @@ -55,6 +56,7 @@ func TestScraperNoDatabaseSingle(t *testing.T) { factory.initMocks([]string{"otel"}) cfg := createDefaultConfig().(*Config) + cfg.Metrics.PostgresqlDeadlocks.Enabled = true scraper := newPostgreSQLScraper(receivertest.NewNopCreateSettings(), cfg, factory) actualMetrics, err := scraper.scrape(context.Background()) @@ -73,6 +75,7 @@ func TestScraperNoDatabaseMultiple(t *testing.T) { factory.initMocks([]string{"otel", "open", "telemetry"}) cfg := createDefaultConfig().(*Config) + cfg.Metrics.PostgresqlDeadlocks.Enabled = true scraper := newPostgreSQLScraper(receivertest.NewNopCreateSettings(), cfg, &factory) actualMetrics, err := scraper.scrape(context.Background()) @@ -91,6 +94,7 @@ func TestScraperWithResourceAttributeFeatureGate(t *testing.T) { factory.initMocks([]string{"otel", "open", "telemetry"}) cfg := createDefaultConfig().(*Config) + cfg.Metrics.PostgresqlDeadlocks.Enabled = true scraper := newPostgreSQLScraper(receivertest.NewNopCreateSettings(), cfg, &factory) actualMetrics, err := scraper.scrape(context.Background()) @@ -109,6 +113,7 @@ func TestScraperWithResourceAttributeFeatureGateSingle(t *testing.T) { factory.initMocks([]string{"otel"}) cfg := createDefaultConfig().(*Config) + cfg.Metrics.PostgresqlDeadlocks.Enabled = true scraper := newPostgreSQLScraper(receivertest.NewNopCreateSettings(), cfg, &factory) actualMetrics, err := scraper.scrape(context.Background()) @@ -210,20 +215,21 @@ func (m *mockClient) initMocks(database string, databases []string, index int) { if database == "" { m.On("listDatabases").Return(databases, nil) - commitsAndRollbacks := map[databaseName]databaseStats{} + dbStats := map[databaseName]databaseStats{} dbSize := map[databaseName]int64{} backends := map[databaseName]int64{} for idx, db := range databases { - commitsAndRollbacks[databaseName(db)] = databaseStats{ + dbStats[databaseName(db)] = databaseStats{ transactionCommitted: int64(idx + 1), transactionRollback: int64(idx + 2), + deadlocks: int64(idx + 3), } dbSize[databaseName(db)] = int64(idx + 4) backends[databaseName(db)] = int64(idx + 3) } - m.On("getDatabaseStats", databases).Return(commitsAndRollbacks, nil) + m.On("getDatabaseStats", databases).Return(dbStats, nil) m.On("getDatabaseSize", databases).Return(dbSize, nil) m.On("getBackends", databases).Return(backends, nil) m.On("getBGWriterStats", mock.Anything).Return(&bgStat{ diff --git a/receiver/postgresqlreceiver/testdata/integration/expected_all_db.yaml b/receiver/postgresqlreceiver/testdata/integration/expected_all_db.yaml index 5f1733bff9cf1..49733b5e9d924 100644 --- a/receiver/postgresqlreceiver/testdata/integration/expected_all_db.yaml +++ b/receiver/postgresqlreceiver/testdata/integration/expected_all_db.yaml @@ -146,6 +146,16 @@ resourceMetrics: startTimeUnixNano: "1687780273472170000" timeUnixNano: "1687780274490198000" unit: By + - description: The number of deadlocks. + name: postgresql.deadlocks + sum: + aggregationTemporality: 2 + dataPoints: + - asInt: "0" + startTimeUnixNano: "1687780273472170000" + timeUnixNano: "1687780274490198000" + isMonotonic: true + unit: "{deadlock}" - description: The number of rollbacks. name: postgresql.rollbacks sum: @@ -194,6 +204,16 @@ resourceMetrics: startTimeUnixNano: "1687780273472170000" timeUnixNano: "1687780274490198000" unit: By + - description: The number of deadlocks. + name: postgresql.deadlocks + sum: + aggregationTemporality: 2 + dataPoints: + - asInt: "0" + startTimeUnixNano: "1687780273472170000" + timeUnixNano: "1687780274490198000" + isMonotonic: true + unit: "{deadlock}" - description: The number of rollbacks. name: postgresql.rollbacks sum: @@ -251,6 +271,16 @@ resourceMetrics: startTimeUnixNano: "1687780273472170000" timeUnixNano: "1687780274490198000" unit: By + - description: The number of deadlocks. + name: postgresql.deadlocks + sum: + aggregationTemporality: 2 + dataPoints: + - asInt: "0" + startTimeUnixNano: "1687780273472170000" + timeUnixNano: "1687780274490198000" + isMonotonic: true + unit: "{deadlock}" - description: The number of rollbacks. name: postgresql.rollbacks sum: diff --git a/receiver/postgresqlreceiver/testdata/integration/expected_multi_db.yaml b/receiver/postgresqlreceiver/testdata/integration/expected_multi_db.yaml index 7d73f47c0cf2e..b3dfb861ebc49 100644 --- a/receiver/postgresqlreceiver/testdata/integration/expected_multi_db.yaml +++ b/receiver/postgresqlreceiver/testdata/integration/expected_multi_db.yaml @@ -146,6 +146,16 @@ resourceMetrics: startTimeUnixNano: "1687780262696586000" timeUnixNano: "1687780263696969000" unit: By + - description: The number of deadlocks. + name: postgresql.deadlocks + sum: + aggregationTemporality: 2 + dataPoints: + - asInt: "0" + startTimeUnixNano: "1687780262696586000" + timeUnixNano: "1687780263696969000" + isMonotonic: true + unit: "{deadlock}" - description: The number of rollbacks. name: postgresql.rollbacks sum: @@ -194,6 +204,16 @@ resourceMetrics: startTimeUnixNano: "1687780262696586000" timeUnixNano: "1687780263696969000" unit: By + - description: The number of deadlocks. + name: postgresql.deadlocks + sum: + aggregationTemporality: 2 + dataPoints: + - asInt: "0" + startTimeUnixNano: "1687780262696586000" + timeUnixNano: "1687780263696969000" + isMonotonic: true + unit: "{deadlock}" - description: The number of rollbacks. name: postgresql.rollbacks sum: diff --git a/receiver/postgresqlreceiver/testdata/integration/expected_single_db.yaml b/receiver/postgresqlreceiver/testdata/integration/expected_single_db.yaml index 18ec9825768d3..c0f598f71447e 100644 --- a/receiver/postgresqlreceiver/testdata/integration/expected_single_db.yaml +++ b/receiver/postgresqlreceiver/testdata/integration/expected_single_db.yaml @@ -146,6 +146,16 @@ resourceMetrics: startTimeUnixNano: "1687780251831660000" timeUnixNano: "1687780252833095000" unit: By + - description: The number of deadlocks. + name: postgresql.deadlocks + sum: + aggregationTemporality: 2 + dataPoints: + - asInt: "0" + startTimeUnixNano: "1687780251831660000" + timeUnixNano: "1687780252833095000" + isMonotonic: true + unit: "{deadlock}" - description: The number of rollbacks. name: postgresql.rollbacks sum: diff --git a/receiver/postgresqlreceiver/testdata/scraper/multiple/expected.yaml b/receiver/postgresqlreceiver/testdata/scraper/multiple/expected.yaml index aa55189c1541b..937943ce47169 100644 --- a/receiver/postgresqlreceiver/testdata/scraper/multiple/expected.yaml +++ b/receiver/postgresqlreceiver/testdata/scraper/multiple/expected.yaml @@ -210,6 +210,16 @@ resourceMetrics: startTimeUnixNano: "1687780218605916000" timeUnixNano: "1687780218606035000" unit: By + - description: The number of deadlocks. + name: postgresql.deadlocks + sum: + aggregationTemporality: 2 + dataPoints: + - asInt: "4" + startTimeUnixNano: "1687780218605916000" + timeUnixNano: "1687780218606035000" + isMonotonic: true + unit: "{deadlock}" - description: The number of rollbacks. name: postgresql.rollbacks sum: @@ -267,6 +277,16 @@ resourceMetrics: startTimeUnixNano: "1687780218605916000" timeUnixNano: "1687780218606035000" unit: By + - description: The number of deadlocks. + name: postgresql.deadlocks + sum: + aggregationTemporality: 2 + dataPoints: + - asInt: "3" + startTimeUnixNano: "1687780218605916000" + timeUnixNano: "1687780218606035000" + isMonotonic: true + unit: "{deadlock}" - description: The number of rollbacks. name: postgresql.rollbacks sum: @@ -324,6 +344,16 @@ resourceMetrics: startTimeUnixNano: "1687780218605916000" timeUnixNano: "1687780218606035000" unit: By + - description: The number of deadlocks. + name: postgresql.deadlocks + sum: + aggregationTemporality: 2 + dataPoints: + - asInt: "5" + startTimeUnixNano: "1687780218605916000" + timeUnixNano: "1687780218606035000" + isMonotonic: true + unit: "{deadlock}" - description: The number of rollbacks. name: postgresql.rollbacks sum: diff --git a/receiver/postgresqlreceiver/testdata/scraper/multiple/expected_with_resource.yaml b/receiver/postgresqlreceiver/testdata/scraper/multiple/expected_with_resource.yaml index 83bcf9e7c4bc6..bbbeeda87d479 100644 --- a/receiver/postgresqlreceiver/testdata/scraper/multiple/expected_with_resource.yaml +++ b/receiver/postgresqlreceiver/testdata/scraper/multiple/expected_with_resource.yaml @@ -210,6 +210,16 @@ resourceMetrics: startTimeUnixNano: "1687780221131489000" timeUnixNano: "1687780221131628000" unit: By + - description: The number of deadlocks. + name: postgresql.deadlocks + sum: + aggregationTemporality: 2 + dataPoints: + - asInt: "4" + startTimeUnixNano: "1687780221131489000" + timeUnixNano: "1687780221131628000" + isMonotonic: true + unit: "{deadlock}" - description: The number of rollbacks. name: postgresql.rollbacks sum: @@ -267,6 +277,16 @@ resourceMetrics: startTimeUnixNano: "1687780221131489000" timeUnixNano: "1687780221131628000" unit: By + - description: The number of deadlocks. + name: postgresql.deadlocks + sum: + aggregationTemporality: 2 + dataPoints: + - asInt: "3" + startTimeUnixNano: "1687780221131489000" + timeUnixNano: "1687780221131628000" + isMonotonic: true + unit: "{deadlock}" - description: The number of rollbacks. name: postgresql.rollbacks sum: @@ -324,6 +344,16 @@ resourceMetrics: startTimeUnixNano: "1687780221131489000" timeUnixNano: "1687780221131628000" unit: By + - description: The number of deadlocks. + name: postgresql.deadlocks + sum: + aggregationTemporality: 2 + dataPoints: + - asInt: "5" + startTimeUnixNano: "1687780221131489000" + timeUnixNano: "1687780221131628000" + isMonotonic: true + unit: "{deadlock}" - description: The number of rollbacks. name: postgresql.rollbacks sum: diff --git a/receiver/postgresqlreceiver/testdata/scraper/otel/expected.yaml b/receiver/postgresqlreceiver/testdata/scraper/otel/expected.yaml index 258c25414ea18..6a76b6d940b23 100644 --- a/receiver/postgresqlreceiver/testdata/scraper/otel/expected.yaml +++ b/receiver/postgresqlreceiver/testdata/scraper/otel/expected.yaml @@ -210,6 +210,16 @@ resourceMetrics: startTimeUnixNano: "1687780216457686000" timeUnixNano: "1687780216457879000" unit: By + - description: The number of deadlocks. + name: postgresql.deadlocks + sum: + aggregationTemporality: 2 + dataPoints: + - asInt: "3" + startTimeUnixNano: "1687780216457686000" + timeUnixNano: "1687780216457879000" + isMonotonic: true + unit: "{deadlock}" - description: The number of rollbacks. name: postgresql.rollbacks sum: diff --git a/receiver/postgresqlreceiver/testdata/scraper/otel/expected_with_resource.yaml b/receiver/postgresqlreceiver/testdata/scraper/otel/expected_with_resource.yaml index 14329a7fe5a6b..789f816c425f7 100644 --- a/receiver/postgresqlreceiver/testdata/scraper/otel/expected_with_resource.yaml +++ b/receiver/postgresqlreceiver/testdata/scraper/otel/expected_with_resource.yaml @@ -210,6 +210,16 @@ resourceMetrics: startTimeUnixNano: "1687780223205928000" timeUnixNano: "1687780223206028000" unit: By + - description: The number of deadlocks. + name: postgresql.deadlocks + sum: + aggregationTemporality: 2 + dataPoints: + - asInt: "3" + startTimeUnixNano: "1687780223205928000" + timeUnixNano: "1687780223206028000" + isMonotonic: true + unit: "{deadlock}" - description: The number of rollbacks. name: postgresql.rollbacks sum: