Skip to content

[receiver/sqlquery] Multiple connections despite max_open_conn = 1 #39270

Closed
@cbandy

Description

@cbandy

Component(s)

receiver/sqlquery

What happened?

Description

#36752 is happening despite #37748. The sqlquery receiver opens one connection for every query, regardless of the max_open_conn setting.

Steps to Reproduce

Use the configuration below with a recent collector and Postgres:

$ docker run --rm -it --net host --env POSTGRES_HOST_AUTH_METHOD=trust docker.io/library/postgres

$ docker run --rm -it --net host -v "$(pwd)/config.yaml:/etc/otelcol-contrib/config.yaml:ro" \
ghcr.io/open-telemetry/opentelemetry-collector-releases/opentelemetry-collector-contrib:0.123.1

Use psql to see the open connections at Postgres:

$ psql -h localhost -U postgres -c 'SELECT pid, backend_type, datname, usename, query, state FROM pg_stat_activity'
┌─────┬──────────────────────────────┬──────────┬──────────┬────────────────────────────────────────────────────────────────────────────────┬────────┐
│ pid │         backend_type         │ datname  │ usename  │                                     query                                      │ state  │
├─────┼──────────────────────────────┼──────────┼──────────┼────────────────────────────────────────────────────────────────────────────────┼────────┤
│ 102 │ client backend               │ postgres │ postgres │ SELECT 1 AS number                                                             │ idle   │
│ 103 │ client backend               │ postgres │ postgres │ SELECT 2 AS number                                                             │ idle   │
│ 104 │ client backend               │ postgres │ postgres │ SELECT 3 AS number                                                             │ idle   │
│ 110 │ client backend               │ postgres │ postgres │ SELECT pid, backend_type, datname, usename, query, state FROM pg_stat_activity │ active │
│  65 │ autovacuum launcher          │ ␀        │ ␀        │                                                                                │ ␀      │
│  66 │ logical replication launcher │ ␀        │ postgres │                                                                                │ ␀      │
│  61 │ checkpointer                 │ ␀        │ ␀        │                                                                                │ ␀      │
│  62 │ background writer            │ ␀        │ ␀        │                                                                                │ ␀      │
│  64 │ walwriter                    │ ␀        │ ␀        │                                                                                │ ␀      │
└─────┴──────────────────────────────┴──────────┴──────────┴────────────────────────────────────────────────────────────────────────────────┴────────┘
(9 rows)

Expected Result

I expected one "client backend" connection because max_open_conn: 1 in the receiver config.

Actual Result

Three "client backend" connections, one for each query.

Collector version

v0.123.1

Environment information

Environment

OS: Debian 12 (bookworm)

OpenTelemetry Collector configuration

---
receivers:
  sqlquery:
    driver: postgres
    datasource: host=localhost sslmode=disable user=postgres
    max_open_conn: 1
    collection_interval: 10s
    queries:
      - sql: 'SELECT 1 AS number'
        metrics:
          - metric_name: num_1
            value_column: number
      - sql: 'SELECT 2 AS number'
        metrics:
          - metric_name: num_2
            value_column: number
      - sql: 'SELECT 3 AS number'
        metrics:
          - metric_name: num_3
            value_column: number
exporters:
  debug: {}
service:
  pipelines:
    metrics:
      receivers: [sqlquery]
      processors: []
      exporters: [debug]

Log output

2025-04-09T04:03:08.577Z        info    [email protected]/service.go:197 Setting up own telemetry...
2025-04-09T04:03:08.578Z        info    builders/builders.go:26 Development component. May change in the future.
2025-04-09T04:03:08.579Z        info    [email protected]/service.go:264 Starting otelcol-contrib...     {"Version": "0.123.1", "NumCPU": 12}
2025-04-09T04:03:08.579Z        info    extensions/extensions.go:41     Starting extensions...
2025-04-09T04:03:08.579Z        info    [email protected]/service.go:287 Everything is ready. Begin running and processing data.
2025-04-09T04:03:09.600Z        info    Metrics {"resource metrics": 3, "metrics": 3, "data points": 3}
2025-04-09T04:03:19.583Z        info    Metrics {"resource metrics": 3, "metrics": 3, "data points": 3}
2025-04-09T04:03:29.583Z        info    Metrics {"resource metrics": 3, "metrics": 3, "data points": 3}
2025-04-09T04:03:39.583Z        info    Metrics {"resource metrics": 3, "metrics": 3, "data points": 3}

Additional context

This function is called during every Scraper's startup, creating multiple pools:

dbProviderFunc := func() (*sql.DB, error) {
dbPool, err := sqlOpenerFunc(sqlCfg.Driver, sqlCfg.DataSource)

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingreceiver/sqlquerySQL query receiver

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions