Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save dbernheisel/a07763e8b473c64a2330b2b23db98dc7 to your computer and use it in GitHub Desktop.

Select an option

Save dbernheisel/a07763e8b473c64a2330b2b23db98dc7 to your computer and use it in GitHub Desktop.
OpentelemetryProcessPropagator credo check
defmodule MyApp.Checks.OtelTaskPropagator do
use Credo.Check,
base_priority: :high,
category: :warning,
explanations: [
check:
"Prefer OpentelemetryProcessPropagator wrappers of `Task` and `Task.Supervisor` so that telemetry tracing can correlate these spawned processes"
]
@impl Credo.Check
def run(source_file, params) do
issue_meta = IssueMeta.for(source_file, params)
{_, _, issues} =
Credo.Code.prewalk(source_file, &traverse(&1, &2, issue_meta), {false, false, []})
issues
end
defp traverse(
{:alias, _meta, [{:__aliases__, _, [:OpentelemetryProcessPropagator, :Task]}]} = ast,
{_task, sup, issues},
_issue_meta
) do
{ast, {true, sup, issues}}
end
defp traverse(
{:alias, _meta,
[{:__aliases__, _, [:OpentelemetryProcessPropagator, :Task, :Supervisor]}]} = ast,
{task, _sup, issues},
_issue_meta
) do
{ast, {task, true, issues}}
end
defp traverse(
{:., meta, [{:__aliases__, _, [:Task]}, _function]} = ast,
{false, sup, issues},
issue_meta
) do
options = [
line_no: meta[:line],
message: "use OpentelemetryProcessPropagator.Task instead of Task",
trigger: "Task"
]
{ast, {false, sup, [format_issue(issue_meta, options) | issues]}}
end
defp traverse(
{:., meta, [{:__aliases__, _, [:Task, :Supervisor]}, _function]} = ast,
{false, false, issues},
issue_meta
) do
options = [
line_no: meta[:line],
message: "use OpentelemetryProcessPropagator.Task.Supervisor instead of Task.Supervisor",
trigger: "Task.Supervisor"
]
{ast, {false, false, [format_issue(issue_meta, options) | issues]}}
end
defp traverse(ast, acc, _issue_meta), do: {ast, acc}
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment