From b5a1da61f2409e79f04723e8df169446f76a1a4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cenk=20K=C3=BCc=C3=BCk?= Date: Fri, 16 Jan 2026 18:26:18 +0000 Subject: [PATCH 01/16] include trace_id in log comments --- lib/plausible/clickhouse_repo.ex | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/lib/plausible/clickhouse_repo.ex b/lib/plausible/clickhouse_repo.ex index a6b29ee3efee..202178e1f65d 100644 --- a/lib/plausible/clickhouse_repo.ex +++ b/lib/plausible/clickhouse_repo.ex @@ -46,7 +46,16 @@ defmodule Plausible.ClickhouseRepo do @impl true def prepare_query(_operation, query, opts) do {plausible_query, opts} = Keyword.pop(opts, :query) - log_comment = if(plausible_query, do: Jason.encode!(plausible_query.debug_metadata), else: "") + + trace_id = get_current_trace_id() + + log_comment_data = + case plausible_query do + nil -> %{trace_id: trace_id} + _ -> Map.put(plausible_query.debug_metadata, :trace_id, trace_id) + end + + log_comment = Jason.encode!(log_comment_data) opts = Keyword.update(opts, :settings, [log_comment: log_comment], fn settings -> @@ -55,4 +64,20 @@ defmodule Plausible.ClickhouseRepo do {query, opts} end + + defp get_current_trace_id do + case OpenTelemetry.Tracer.current_span_ctx() do + :undefined -> + nil + + span_ctx -> + trace_id = OpenTelemetry.Span.trace_id(span_ctx) + + if is_integer(trace_id) and trace_id > 0 do + Integer.to_string(trace_id, 16) |> String.downcase() + else + nil + end + end + end end From dce5eb7297c100c4f6839b5bf0ea38679d86ed38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cenk=20K=C3=BCc=C3=BCk?= Date: Fri, 16 Jan 2026 18:26:54 +0000 Subject: [PATCH 02/16] site team_id to OpenTelemetry attributes --- lib/plausible/open_telemetry.ex | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/plausible/open_telemetry.ex b/lib/plausible/open_telemetry.ex index a04efade0aa0..275a61d1372c 100644 --- a/lib/plausible/open_telemetry.ex +++ b/lib/plausible/open_telemetry.ex @@ -8,7 +8,8 @@ defmodule Plausible.OpenTelemetry do %Plausible.Site{} = site -> Tracer.set_attributes([ {"plausible.site.id", site.id}, - {"plausible.site.domain", site.domain} + {"plausible.site.domain", site.domain}, + {"plausible.site.team_id", site.team_id} ]) id when is_integer(id) -> From 8c71ad6cc8dac2071251303b1d91e021994b5caf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cenk=20K=C3=BCc=C3=BCk?= Date: Fri, 16 Jan 2026 18:32:50 +0000 Subject: [PATCH 03/16] Move tracing to QueryRunner so that all queries profit from additional attributes in their spans --- lib/plausible/stats/aggregate.ex | 2 -- lib/plausible/stats/query_runner.ex | 3 +++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/plausible/stats/aggregate.ex b/lib/plausible/stats/aggregate.ex index 5b77b8c9a5dc..f637c62a5a33 100644 --- a/lib/plausible/stats/aggregate.ex +++ b/lib/plausible/stats/aggregate.ex @@ -9,8 +9,6 @@ defmodule Plausible.Stats.Aggregate do alias Plausible.Stats.{Query, QueryRunner, QueryResult, QueryOptimizer} def aggregate(site, query, metrics) do - Query.trace(query, metrics) - query = query |> Query.set(metrics: metrics, remove_unavailable_revenue_metrics: true) diff --git a/lib/plausible/stats/query_runner.ex b/lib/plausible/stats/query_runner.ex index 1478d7e1b709..8088d54cafea 100644 --- a/lib/plausible/stats/query_runner.ex +++ b/lib/plausible/stats/query_runner.ex @@ -15,6 +15,7 @@ defmodule Plausible.Stats.QueryRunner do alias Plausible.Stats.{ Comparisons, Compare, + Query, QueryOptimizer, QueryResult, Metrics, @@ -36,6 +37,8 @@ defmodule Plausible.Stats.QueryRunner do def run(site, query) do optimized_query = QueryOptimizer.optimize(query) + Query.trace(optimized_query, optimized_query.metrics) + %__MODULE__{main_query: optimized_query, site: site} |> execute_main_query() |> add_comparison_query() From bc311933b7c61ed4d6fbaa12e92cda5fbe0ba089 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cenk=20K=C3=BCc=C3=BCk?= Date: Fri, 16 Jan 2026 18:42:44 +0000 Subject: [PATCH 04/16] Add trace_id assertion to debug metadata test --- .../api/external_stats_controller/debug_metadata_test.exs | 1 + 1 file changed, 1 insertion(+) diff --git a/test/plausible_web/controllers/api/external_stats_controller/debug_metadata_test.exs b/test/plausible_web/controllers/api/external_stats_controller/debug_metadata_test.exs index cb22646835cc..f490e5406415 100644 --- a/test/plausible_web/controllers/api/external_stats_controller/debug_metadata_test.exs +++ b/test/plausible_web/controllers/api/external_stats_controller/debug_metadata_test.exs @@ -42,6 +42,7 @@ defmodule PlausibleWeb.Api.ExternalController.DebugMetadataTest do "site_domain" => ^site.domain, "site_id" => ^site.id, "team_id" => ^team_of(user).id, + "trace_id" => _, "user_id" => ^user.id }) = decoded From 4e472129e4d6ec6ac60d283ef4271316840757ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cenk=20K=C3=BCc=C3=BCk?= Date: Fri, 16 Jan 2026 18:44:50 +0000 Subject: [PATCH 05/16] Fix warning --- .../api/external_stats_controller/debug_metadata_test.exs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/plausible_web/controllers/api/external_stats_controller/debug_metadata_test.exs b/test/plausible_web/controllers/api/external_stats_controller/debug_metadata_test.exs index f490e5406415..eb76ad08586f 100644 --- a/test/plausible_web/controllers/api/external_stats_controller/debug_metadata_test.exs +++ b/test/plausible_web/controllers/api/external_stats_controller/debug_metadata_test.exs @@ -16,7 +16,7 @@ defmodule PlausibleWeb.Api.ExternalController.DebugMetadataTest do } conn = - post(conn, "api/v2/query", query) + post(conn, "/api/v2/query", query) assert json_response(conn, 200) @@ -38,7 +38,7 @@ defmodule PlausibleWeb.Api.ExternalController.DebugMetadataTest do "phoenix_controller" => "Elixir.PlausibleWeb.Api.ExternalQueryApiController", "request_method" => "POST", - "request_path" => "api/v2/query", + "request_path" => "/api/v2/query", "site_domain" => ^site.domain, "site_id" => ^site.id, "team_id" => ^team_of(user).id, From b89b99a8cde55dff18b5d383578d29763f19ffc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cenk=20K=C3=BCc=C3=BCk?= Date: Fri, 16 Jan 2026 19:02:04 +0000 Subject: [PATCH 06/16] add trace_id --- .../controllers/api/stats_controller/debug_metadata_test.exs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/plausible_web/controllers/api/stats_controller/debug_metadata_test.exs b/test/plausible_web/controllers/api/stats_controller/debug_metadata_test.exs index abe2af055a5c..42e379bc639f 100644 --- a/test/plausible_web/controllers/api/stats_controller/debug_metadata_test.exs +++ b/test/plausible_web/controllers/api/stats_controller/debug_metadata_test.exs @@ -32,6 +32,7 @@ defmodule PlausibleWeb.Api.StatsController.DebugMetadataTest do "site_domain" => ^site.domain, "site_id" => ^site.id, "team_id" => ^team_of(user).id, + "trace_id" => _, "user_id" => ^user.id }) = decoded end @@ -90,6 +91,7 @@ defmodule PlausibleWeb.Api.StatsController.DebugMetadataTest do "site_id" => ^site.id, # nil team_id because viewing a public/shared dashboard "team_id" => nil, + "trace_id" => _, # the logged in user ID is included even when viewing a random public dashboard "user_id" => ^user.id }) = decoded From 87ac012c31eb78b0001cc8d1fa5254654eb978c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cenk=20K=C3=BCc=C3=BCk?= Date: Fri, 16 Jan 2026 19:30:41 +0000 Subject: [PATCH 07/16] remove integer check --- lib/plausible/clickhouse_repo.ex | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/lib/plausible/clickhouse_repo.ex b/lib/plausible/clickhouse_repo.ex index 202178e1f65d..4aafe4d61e99 100644 --- a/lib/plausible/clickhouse_repo.ex +++ b/lib/plausible/clickhouse_repo.ex @@ -72,12 +72,7 @@ defmodule Plausible.ClickhouseRepo do span_ctx -> trace_id = OpenTelemetry.Span.trace_id(span_ctx) - - if is_integer(trace_id) and trace_id > 0 do - Integer.to_string(trace_id, 16) |> String.downcase() - else - nil - end + Integer.to_string(trace_id, 16) |> String.downcase() end end end From ad5fd495abec097b61c4831d952a7a3d61e805e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cenk=20K=C3=BCc=C3=BCk?= Date: Fri, 16 Jan 2026 22:23:28 +0000 Subject: [PATCH 08/16] log trace_id to correlate logs and traces --- config/runtime.exs | 2 +- lib/plausible/application.ex | 1 + lib/plausible/open_telemetry/logger.ex | 38 ++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 lib/plausible/open_telemetry/logger.ex diff --git a/config/runtime.exs b/config/runtime.exs index 25575faeff1f..37baec0937be 100644 --- a/config/runtime.exs +++ b/config/runtime.exs @@ -27,7 +27,7 @@ log_level = |> String.to_existing_atom() config :logger, level: log_level -config :logger, :default_formatter, metadata: [:request_id] +config :logger, :default_formatter, metadata: [:request_id, :trace_id] config :logger, Sentry.LoggerBackend, capture_log_messages: true, diff --git a/lib/plausible/application.ex b/lib/plausible/application.ex index 0926eba4a1bb..aa949964589b 100644 --- a/lib/plausible/application.ex +++ b/lib/plausible/application.ex @@ -371,6 +371,7 @@ defmodule Plausible.Application do OpentelemetryEcto.setup([:plausible, :repo]) OpentelemetryEcto.setup([:plausible, :clickhouse_repo]) OpentelemetryOban.setup() + Plausible.OpenTelemetry.Logger.setup() end defp setup_geolocation do diff --git a/lib/plausible/open_telemetry/logger.ex b/lib/plausible/open_telemetry/logger.ex new file mode 100644 index 000000000000..0bcce3cc03b5 --- /dev/null +++ b/lib/plausible/open_telemetry/logger.ex @@ -0,0 +1,38 @@ +defmodule Plausible.OpenTelemetry.Logger do + @moduledoc """ + Telemetry handler that adds the OpenTelemetry trace_id to Logger metadata. + + This enables correlation between log lines and distributed traces. + The trace_id is extracted from the current OTel span context and added + to the Logger metadata when Phoenix router dispatch starts. + """ + + require Logger + + @doc """ + Attaches telemetry handlers to set trace_id in Logger metadata. + + Should be called during application startup, after OpentelemetryPhoenix.setup(). + """ + def setup do + :telemetry.attach( + "plausible-otel-logger-metadata", + [:phoenix, :router_dispatch, :start], + &__MODULE__.handle_router_dispatch_start/4, + %{} + ) + end + + @doc false + def handle_router_dispatch_start(_event, _measurements, _metadata, _config) do + case OpenTelemetry.Tracer.current_span_ctx() do + :undefined -> + :ok + + span_ctx -> + trace_id = OpenTelemetry.Span.trace_id(span_ctx) + trace_id_hex = Integer.to_string(trace_id, 16) |> String.downcase() + Logger.metadata(trace_id: trace_id_hex) + end + end +end From 032e8299ea2b7ea2d4621f0d49ab3313b57bd8d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cenk=20K=C3=BCc=C3=BCk?= Date: Mon, 19 Jan 2026 14:54:30 +0000 Subject: [PATCH 09/16] Update lib/plausible/clickhouse_repo.ex Co-authored-by: Adrian Gruntkowski --- lib/plausible/clickhouse_repo.ex | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/plausible/clickhouse_repo.ex b/lib/plausible/clickhouse_repo.ex index 4aafe4d61e99..7a1a4787694d 100644 --- a/lib/plausible/clickhouse_repo.ex +++ b/lib/plausible/clickhouse_repo.ex @@ -50,9 +50,10 @@ defmodule Plausible.ClickhouseRepo do trace_id = get_current_trace_id() log_comment_data = - case plausible_query do - nil -> %{trace_id: trace_id} - _ -> Map.put(plausible_query.debug_metadata, :trace_id, trace_id) + if plausible_query do + Map.put(plausible_query.debug_metadata, :trace_id, trace_id) + else + %{trace_id: trace_id} end log_comment = Jason.encode!(log_comment_data) From 814cd67a7a3896feb062b9d97049203dd8e0881f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cenk=20K=C3=BCc=C3=BCk?= Date: Mon, 19 Jan 2026 15:03:58 +0000 Subject: [PATCH 10/16] Update lib/plausible/open_telemetry/logger.ex Co-authored-by: Adrian Gruntkowski --- lib/plausible/open_telemetry/logger.ex | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/plausible/open_telemetry/logger.ex b/lib/plausible/open_telemetry/logger.ex index 0bcce3cc03b5..f56bdc03a782 100644 --- a/lib/plausible/open_telemetry/logger.ex +++ b/lib/plausible/open_telemetry/logger.ex @@ -30,8 +30,11 @@ defmodule Plausible.OpenTelemetry.Logger do :ok span_ctx -> - trace_id = OpenTelemetry.Span.trace_id(span_ctx) - trace_id_hex = Integer.to_string(trace_id, 16) |> String.downcase() + trace_id_hex = + span_ctx + |> OpenTelemetry.Span.trace_id() + |> Integer.to_string(16) + |> String.downcase() Logger.metadata(trace_id: trace_id_hex) end end From 3c0f53c21992bc4f7c1d5d6f7d267c4eaf0e0ad1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cenk=20K=C3=BCc=C3=BCk?= Date: Mon, 19 Jan 2026 15:14:06 +0000 Subject: [PATCH 11/16] mix format --- lib/plausible/clickhouse_repo.ex | 2 +- lib/plausible/open_telemetry/logger.ex | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/plausible/clickhouse_repo.ex b/lib/plausible/clickhouse_repo.ex index 7a1a4787694d..073b6e1a02da 100644 --- a/lib/plausible/clickhouse_repo.ex +++ b/lib/plausible/clickhouse_repo.ex @@ -53,7 +53,7 @@ defmodule Plausible.ClickhouseRepo do if plausible_query do Map.put(plausible_query.debug_metadata, :trace_id, trace_id) else - %{trace_id: trace_id} + %{trace_id: trace_id} end log_comment = Jason.encode!(log_comment_data) diff --git a/lib/plausible/open_telemetry/logger.ex b/lib/plausible/open_telemetry/logger.ex index f56bdc03a782..b8b5c030b33e 100644 --- a/lib/plausible/open_telemetry/logger.ex +++ b/lib/plausible/open_telemetry/logger.ex @@ -31,10 +31,11 @@ defmodule Plausible.OpenTelemetry.Logger do span_ctx -> trace_id_hex = - span_ctx + span_ctx |> OpenTelemetry.Span.trace_id() - |> Integer.to_string(16) + |> Integer.to_string(16) |> String.downcase() + Logger.metadata(trace_id: trace_id_hex) end end From 969d60cf3bad5a5174e87a80ed444761fc3bb259 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cenk=20K=C3=BCc=C3=BCk?= Date: Mon, 19 Jan 2026 16:14:23 +0000 Subject: [PATCH 12/16] Refactor trace_id retrieval --- lib/plausible/clickhouse_repo.ex | 13 +------------ lib/plausible/open_telemetry.ex | 13 +++++++++++++ lib/plausible/open_telemetry/logger.ex | 12 +++--------- 3 files changed, 17 insertions(+), 21 deletions(-) diff --git a/lib/plausible/clickhouse_repo.ex b/lib/plausible/clickhouse_repo.ex index 073b6e1a02da..56cb0f299e24 100644 --- a/lib/plausible/clickhouse_repo.ex +++ b/lib/plausible/clickhouse_repo.ex @@ -47,7 +47,7 @@ defmodule Plausible.ClickhouseRepo do def prepare_query(_operation, query, opts) do {plausible_query, opts} = Keyword.pop(opts, :query) - trace_id = get_current_trace_id() + trace_id = Plausible.OpenTelemetry.current_trace_id() log_comment_data = if plausible_query do @@ -65,15 +65,4 @@ defmodule Plausible.ClickhouseRepo do {query, opts} end - - defp get_current_trace_id do - case OpenTelemetry.Tracer.current_span_ctx() do - :undefined -> - nil - - span_ctx -> - trace_id = OpenTelemetry.Span.trace_id(span_ctx) - Integer.to_string(trace_id, 16) |> String.downcase() - end - end end diff --git a/lib/plausible/open_telemetry.ex b/lib/plausible/open_telemetry.ex index 275a61d1372c..24b11bc1b6fb 100644 --- a/lib/plausible/open_telemetry.ex +++ b/lib/plausible/open_telemetry.ex @@ -3,6 +3,19 @@ defmodule Plausible.OpenTelemetry do require OpenTelemetry.Tracer, as: Tracer + def current_trace_id do + case OpenTelemetry.Tracer.current_span_ctx() do + :undefined -> + nil + + span_ctx -> + span_ctx + |> OpenTelemetry.Span.trace_id() + |> Integer.to_string(16) + |> String.downcase() + end + end + def add_site_attributes(site) do case site do %Plausible.Site{} = site -> diff --git a/lib/plausible/open_telemetry/logger.ex b/lib/plausible/open_telemetry/logger.ex index b8b5c030b33e..c44fcd558af7 100644 --- a/lib/plausible/open_telemetry/logger.ex +++ b/lib/plausible/open_telemetry/logger.ex @@ -25,17 +25,11 @@ defmodule Plausible.OpenTelemetry.Logger do @doc false def handle_router_dispatch_start(_event, _measurements, _metadata, _config) do - case OpenTelemetry.Tracer.current_span_ctx() do - :undefined -> + case Plausible.OpenTelemetry.current_trace_id() do + nil -> :ok - span_ctx -> - trace_id_hex = - span_ctx - |> OpenTelemetry.Span.trace_id() - |> Integer.to_string(16) - |> String.downcase() - + trace_id_hex -> Logger.metadata(trace_id: trace_id_hex) end end From 15f712da9ad7b003518ff818788d31f6ccec79b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cenk=20K=C3=BCc=C3=BCk?= Date: Wed, 21 Jan 2026 20:40:41 +0000 Subject: [PATCH 13/16] configure otlp endpoint via env --- config/runtime.exs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/config/runtime.exs b/config/runtime.exs index 37baec0937be..b3bee03c89df 100644 --- a/config/runtime.exs +++ b/config/runtime.exs @@ -224,6 +224,7 @@ config :plausible, :runtime_metadata, runtime_metadata sentry_dsn = get_var_from_path_or_env(config_dir, "SENTRY_DSN") honeycomb_api_key = get_var_from_path_or_env(config_dir, "HONEYCOMB_API_KEY") honeycomb_dataset = get_var_from_path_or_env(config_dir, "HONEYCOMB_DATASET") +otlp_endpoint = get_var_from_path_or_env(config_dir, "OTLP_ENDPOINT") paddle_auth_code = get_var_from_path_or_env(config_dir, "PADDLE_VENDOR_AUTH_CODE") paddle_vendor_id = get_var_from_path_or_env(config_dir, "PADDLE_VENDOR_ID") google_cid = get_var_from_path_or_env(config_dir, "GOOGLE_CLIENT_ID") @@ -941,7 +942,7 @@ if honeycomb_api_key && honeycomb_dataset do config :opentelemetry_exporter, otlp_protocol: :grpc, - otlp_endpoint: "https://api.honeycomb.io:443", + otlp_endpoint: otlp_endpoint || "https://api.honeycomb.io:443", otlp_headers: [ {"x-honeycomb-team", honeycomb_api_key}, {"x-honeycomb-dataset", honeycomb_dataset} From 9e83fc3623cd2dce62f9cc1c936dcde9b75e109e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cenk=20K=C3=BCc=C3=BCk?= Date: Wed, 21 Jan 2026 20:41:03 +0000 Subject: [PATCH 14/16] disable sampler --- config/runtime.exs | 1 - 1 file changed, 1 deletion(-) diff --git a/config/runtime.exs b/config/runtime.exs index b3bee03c89df..5c3398b60fde 100644 --- a/config/runtime.exs +++ b/config/runtime.exs @@ -936,7 +936,6 @@ end if honeycomb_api_key && honeycomb_dataset do config :opentelemetry, resource: Plausible.OpenTelemetry.resource_attributes(runtime_metadata), - sampler: {Plausible.OpenTelemetry.Sampler, %{ratio: otel_sampler_ratio}}, span_processor: :batch, traces_exporter: :otlp From 5fbca1ef3bce6b478d895a6d8588c3256fc8d961 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cenk=20K=C3=BCc=C3=BCk?= Date: Wed, 21 Jan 2026 20:44:34 +0000 Subject: [PATCH 15/16] set default for variable --- config/runtime.exs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/config/runtime.exs b/config/runtime.exs index 5c3398b60fde..cc4fa6e4950e 100644 --- a/config/runtime.exs +++ b/config/runtime.exs @@ -224,7 +224,10 @@ config :plausible, :runtime_metadata, runtime_metadata sentry_dsn = get_var_from_path_or_env(config_dir, "SENTRY_DSN") honeycomb_api_key = get_var_from_path_or_env(config_dir, "HONEYCOMB_API_KEY") honeycomb_dataset = get_var_from_path_or_env(config_dir, "HONEYCOMB_DATASET") -otlp_endpoint = get_var_from_path_or_env(config_dir, "OTLP_ENDPOINT") + +otlp_endpoint = + get_var_from_path_or_env(config_dir, "OTLP_ENDPOINT", "https://api.honeycomb.io:443") + paddle_auth_code = get_var_from_path_or_env(config_dir, "PADDLE_VENDOR_AUTH_CODE") paddle_vendor_id = get_var_from_path_or_env(config_dir, "PADDLE_VENDOR_ID") google_cid = get_var_from_path_or_env(config_dir, "GOOGLE_CLIENT_ID") @@ -941,7 +944,7 @@ if honeycomb_api_key && honeycomb_dataset do config :opentelemetry_exporter, otlp_protocol: :grpc, - otlp_endpoint: otlp_endpoint || "https://api.honeycomb.io:443", + otlp_endpoint: otlp_endpoint, otlp_headers: [ {"x-honeycomb-team", honeycomb_api_key}, {"x-honeycomb-dataset", honeycomb_dataset} From ade67fe1dcb49abd55c08893349705f1f9d89a29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cenk=20K=C3=BCc=C3=BCk?= Date: Thu, 22 Jan 2026 18:30:03 +0000 Subject: [PATCH 16/16] remove custom opentelemetry sampler --- config/runtime.exs | 10 +---- lib/plausible/open_telemetry/sampler.ex | 60 ------------------------- 2 files changed, 2 insertions(+), 68 deletions(-) delete mode 100644 lib/plausible/open_telemetry/sampler.ex diff --git a/config/runtime.exs b/config/runtime.exs index cc4fa6e4950e..327c1185f55c 100644 --- a/config/runtime.exs +++ b/config/runtime.exs @@ -224,10 +224,6 @@ config :plausible, :runtime_metadata, runtime_metadata sentry_dsn = get_var_from_path_or_env(config_dir, "SENTRY_DSN") honeycomb_api_key = get_var_from_path_or_env(config_dir, "HONEYCOMB_API_KEY") honeycomb_dataset = get_var_from_path_or_env(config_dir, "HONEYCOMB_DATASET") - -otlp_endpoint = - get_var_from_path_or_env(config_dir, "OTLP_ENDPOINT", "https://api.honeycomb.io:443") - paddle_auth_code = get_var_from_path_or_env(config_dir, "PADDLE_VENDOR_AUTH_CODE") paddle_vendor_id = get_var_from_path_or_env(config_dir, "PADDLE_VENDOR_ID") google_cid = get_var_from_path_or_env(config_dir, "GOOGLE_CLIENT_ID") @@ -238,10 +234,8 @@ help_scout_app_secret = get_var_from_path_or_env(config_dir, "HELP_SCOUT_APP_SEC help_scout_signature_key = get_var_from_path_or_env(config_dir, "HELP_SCOUT_SIGNATURE_KEY") help_scout_vault_key = get_var_from_path_or_env(config_dir, "HELP_SCOUT_VAULT_KEY") -{otel_sampler_ratio, ""} = - config_dir - |> get_var_from_path_or_env("OTEL_SAMPLER_RATIO", "0.5") - |> Float.parse() +otlp_endpoint = + get_var_from_path_or_env(config_dir, "OTLP_ENDPOINT", "https://api.honeycomb.io:443") geolite2_country_db = get_var_from_path_or_env( diff --git a/lib/plausible/open_telemetry/sampler.ex b/lib/plausible/open_telemetry/sampler.ex deleted file mode 100644 index 39ba762f4a9e..000000000000 --- a/lib/plausible/open_telemetry/sampler.ex +++ /dev/null @@ -1,60 +0,0 @@ -defmodule Plausible.OpenTelemetry.Sampler do - @moduledoc """ - [Custom OpenTelemetry sampler](https://hexdocs.pm/opentelemetry/readme.html#samplers) - implementation that ignores particular traces to reduce noise. Ingestion - HTTP requests and queries to Oban tables are ignored, for example. - - For non-ignored traces, implements trace ID ratio-based sampling following the method - from [built-in sampler](https://github.com/open-telemetry/opentelemetry-erlang/blob/main/apps/opentelemetry/src/otel_sampler_trace_id_ratio_based.erl). - """ - - import Bitwise, only: [&&&: 2] - - # mask for extracting first 64 bits of trace ID - # 2^63 - 1 - @max_value 9_223_372_036_854_775_807 - - @behaviour :otel_sampler - require OpenTelemetry.Tracer, as: Tracer - - @routes_to_ignore ["/api/event", "/api/event/", "/api//event", "//api/event"] - @tables_to_ignore ["oban_jobs", "site_imports"] - - @impl true - def setup(%{ratio: ratio}) when is_number(ratio) do - %{ratio: ratio, id_upper_bound: ratio * @max_value} - end - - @impl true - def description(%{ratio: ratio}) do - "#{inspect(__MODULE__)}{ratio=#{ratio}}" - end - - @impl true - def should_sample(context, trace_id, _links, _name, _kind, attributes, config) do - tracestate = context |> Tracer.current_span_ctx() |> OpenTelemetry.Span.tracestate() - - case attributes do - %{"db.instance": _db, source: source} when source in @tables_to_ignore -> - {:drop, [], tracestate} - - %{"http.target": http_target} when http_target in @routes_to_ignore -> - {:drop, [], tracestate} - - _any -> - {decide(trace_id, config.id_upper_bound), [], tracestate} - end - end - - defp decide(trace_id, id_upper_bound) when is_integer(trace_id) and trace_id > 0 do - lower_64_bits = trace_id &&& @max_value - - if abs(lower_64_bits) < id_upper_bound do - :record_and_sample - else - :drop - end - end - - defp decide(_, _), do: :drop -end