Skip to content

max_explain_each_interval - Syntax error #40706

@oliverwoe-avl

Description

@oliverwoe-avl

Component(s)

receiver/postgresql

What happened?

Description

According to this exception something is wrong with the way postgresqlreceiver builds the explain query:

2025-06-12T09:16:52.056+0000	error	[email protected]/client.go:112	failed to explain statement	{"resource": {"service.instance.id": "8c35dd2c-232c-47a0-adcd-0e108dce70a9", "service.name": "otelcol-contrib", "service.version": "0.128.0"}, "otelcol.component.id": "postgresql", 
"otelcol.component.kind": "receiver", "otelcol.signal": "logs", "error": "pq: syntax error at or near \"+\""}
github.com/open-telemetry/opentelemetry-collector-contrib/receiver/postgresqlreceiver.(*postgreSQLClient).explainQuery
	github.com/open-telemetry/opentelemetry-collector-contrib/receiver/[email protected]/client.go:112
github.com/open-telemetry/opentelemetry-collector-contrib/receiver/postgresqlreceiver.(*postgreSQLScraper).collectTopQuery
	github.com/open-telemetry/opentelemetry-collector-contrib/receiver/[email protected]/scraper.go:346
github.com/open-telemetry/opentelemetry-collector-contrib/receiver/postgresqlreceiver.(*postgreSQLScraper).scrapeTopQuery
	github.com/open-telemetry/opentelemetry-collector-contrib/receiver/[email protected]/scraper.go:211
github.com/open-telemetry/opentelemetry-collector-contrib/receiver/postgresqlreceiver.createLogsReceiver.func3
	github.com/open-telemetry/opentelemetry-collector-contrib/receiver/[email protected]/factory.go:150
go.opentelemetry.io/collector/scraper.ScrapeLogsFunc.ScrapeLogs
	go.opentelemetry.io/collector/[email protected]/logs.go:25
go.opentelemetry.io/collector/scraper/scraperhelper.wrapObsLogs.func1
	go.opentelemetry.io/collector/scraper/[email protected]/obs_logs.go:49
go.opentelemetry.io/collector/scraper.ScrapeLogsFunc.ScrapeLogs
	go.opentelemetry.io/collector/[email protected]/logs.go:25
go.opentelemetry.io/collector/scraper/scraperhelper.scrapeLogs
	go.opentelemetry.io/collector/scraper/[email protected]/controller.go:237
go.opentelemetry.io/collector/scraper/scraperhelper.NewLogsController.func1
	go.opentelemetry.io/collector/scraper/[email protected]/controller.go:204
go.opentelemetry.io/collector/scraper/scraperhelper.(*controller[...]).startScraping.func1
	go.opentelemetry.io/collector/scraper/[email protected]/controller.go:171

I can't 100% tell which query is producing the error, but I suspect it might be one or all of these:

SELECT 
  CASE WHEN length ( t.x ) :: int > ? AND substring ( t.x, ( length ( t.x ) :: int - ? ) + ? ) LIKE ? 
    THEN substring ( t.x, ( length ( t.x ) :: int - ? ) + ? ) 
    ELSE ? END 
FROM table t
WITH RECURSIVE query AS (
  SELECT id, COALESCE ( t.col, ? ) path, ? lvl FROM table t
  UNION ALL 
SELECT id, path, COALESCE ( t.col, ? ) lvl + ? FROM query) 
SEARCH DEPTH FIRST BY col SET sort CYCLE id set is_cycle USING ids 
SELECT col FROM query WHERE NOT is_cycle AND somecol = ? ORDER BY sort

(More logging here would be appreciated)

When top_query_collection.max_explain_each_interval > 0 is set and explainQuery function errors out, all other entries are unprocessed.

Steps to Reproduce

Having + characters in query seems to break the explain query.

Expected Result

  1. correct explain query gets generated by postgresqlreceiver
  2. skip failed queries, continue processing the others

Actual Result

OTEL collector fails, skips all entries from pg_stat_statements table

Collector version

0.128.0

Environment information

Environment

OS: Windows 11

OpenTelemetry Collector configuration

receivers:
  postgresql:
    endpoint: psqlserver:5432
    username: postgres
    password: ${PW}
    collection_interval: 1m
    tls:
      insecure: true
    query_sample_collection:
      enabled: true
    top_query_collection:
      enabled: true
      max_explain_each_interval: 10
    resource_attributes:
      postgresql.database.name:
        enabled: true
      postgresql.index.name:
        enabled: true
      postgresql.schema.name:
        enabled: true
      postgresql.table.name:
        enabled: true

exporters:
  debug:
    verbosity: detailed # basic - normal - detailed

service:
  telemetry:
    logs:
      level: debug

  pipelines:
   logs:
    receivers:
      - postgresql
    processors: []
    exporters:
      - debug

Log output

2025-06-12T09:16:52.056+0000	error	[email protected]/client.go:112	failed to explain statement	{"resource": {"service.instance.id": "8c35dd2c-232c-47a0-adcd-0e108dce70a9", "service.name": "otelcol-contrib", "service.version": "0.128.0"}, "otelcol.component.id": "postgresql", 
"otelcol.component.kind": "receiver", "otelcol.signal": "logs", "error": "pq: syntax error at or near \"+\""}
github.com/open-telemetry/opentelemetry-collector-contrib/receiver/postgresqlreceiver.(*postgreSQLClient).explainQuery
	github.com/open-telemetry/opentelemetry-collector-contrib/receiver/[email protected]/client.go:112
github.com/open-telemetry/opentelemetry-collector-contrib/receiver/postgresqlreceiver.(*postgreSQLScraper).collectTopQuery
	github.com/open-telemetry/opentelemetry-collector-contrib/receiver/[email protected]/scraper.go:346
github.com/open-telemetry/opentelemetry-collector-contrib/receiver/postgresqlreceiver.(*postgreSQLScraper).scrapeTopQuery
	github.com/open-telemetry/opentelemetry-collector-contrib/receiver/[email protected]/scraper.go:211
github.com/open-telemetry/opentelemetry-collector-contrib/receiver/postgresqlreceiver.createLogsReceiver.func3
	github.com/open-telemetry/opentelemetry-collector-contrib/receiver/[email protected]/factory.go:150
go.opentelemetry.io/collector/scraper.ScrapeLogsFunc.ScrapeLogs
	go.opentelemetry.io/collector/[email protected]/logs.go:25
go.opentelemetry.io/collector/scraper/scraperhelper.wrapObsLogs.func1
	go.opentelemetry.io/collector/scraper/[email protected]/obs_logs.go:49
go.opentelemetry.io/collector/scraper.ScrapeLogsFunc.ScrapeLogs
	go.opentelemetry.io/collector/[email protected]/logs.go:25
go.opentelemetry.io/collector/scraper/scraperhelper.scrapeLogs
	go.opentelemetry.io/collector/scraper/[email protected]/controller.go:237
go.opentelemetry.io/collector/scraper/scraperhelper.NewLogsController.func1
	go.opentelemetry.io/collector/scraper/[email protected]/controller.go:204
go.opentelemetry.io/collector/scraper/scraperhelper.(*controller[...]).startScraping.func1
	go.opentelemetry.io/collector/scraper/[email protected]/controller.go:171

Additional context

No response

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions