Files
mattermost/server
Christopher Poile 65500cc820 MM Build 2025 - Skadoosh - Serve plugin metrics to standard /metrics endpoint (#34678)
* gather plugin metrics and serve on /metrics

* tests

* fix recent conflicts from master

* fix linting

* address review feedback: feature flag, route guard, and unit tests for plugin metrics

- Add PluginMetricsCollection feature flag (default true) to allow disabling plugin metric collection without a deploy
- Only wrap the /metrics handler with plugin metric collection (not arbitrary plugin routes, which would cause double-listing)
- Extract wrapping logic into wrapMetricsHandler for clarity
- Add unit tests for addPluginLabelToMetrics covering no-label, existing-label, comments, empty lines, and multiple metrics cases

* fix integration tests to use /metrics route so wrapMetricsHandler runs

* switch addPluginLabelToMetrics to use expfmt for correct label injection

Replace string manipulation with expfmt parse→mutate→re-encode, which
correctly handles all metric types, timestamps, and malformed input.
Output is normalized: blank lines are dropped and TYPE headers are
injected for undeclared metrics. Update unit tests accordingly.

* refine addPluginLabelToMetrics: log warnings, drop sort, use assert.Contains

- Log a warning (instead of silently discarding) on parse or encode errors,
  returning empty string in both cases
- Remove name sorting — metric family order is irrelevant to Prometheus scrapers
- Switch unit test assertions to assert.Contains per line so tests are
  order-independent

* replace strPtr helper with model.NewPointer

* fix gofmt: remove extra blank line

* replace existing plugin_id label instead of appending a duplicate

If a plugin already exports a plugin_id label, overwrite it rather than
appending a second one, which would produce invalid Prometheus output.
Add test coverage for the replace path.

* add missing test coverage per mattermost-build feedback

- Unit test: malformed input returns empty string without panicking
- Integration: PluginMetricsCollection=false excludes plugin metrics
- Integration: plugin returning non-200 status excluded from response
- Integration: plugin returning empty body excluded from response

* rename PluginMetricsCollection to AggregatePluginMetrics, default false

---------

Co-authored-by: Jesse Hallam <jesse@mattermost.com>
2026-04-22 15:04:13 +00:00
..
2026-04-21 02:33:20 -07:00