-module(opentelemetry_heroku).
-behaviour(otel_resource_detector).
-export([get_resource/1]).
-include_lib("opentelemetry_semantic_conventions/include/resource.hrl").
get_resource(_) ->
Attributes = [
{?CLOUD_PROVIDER, <<"heroku">>},
{?SERVICE_NAME, get_env("HEROKU_APP_NAME")},
{?SERVICE_INSTANCE_ID, get_env("HEROKU_DYNO_ID")},
{?SERVICE_VERSION, get_env("HEROKU_RELEASE_VERSION")},
{'heroku.app.id', get_env("HEROKU_APP_ID")},
{'heroku.release.creation_timestamp', get_env("HEROKU_RELEASE_CREATED_AT")},
{'heroku.release.commit', get_env("HEROKU_SLUG_COMMIT")}
],
% Don't return environment variables that don't exist
CleanAttributes = lists:filter(fun({_Key, Value}) -> is_binary(Value) end, Attributes),
otel_resource:create(CleanAttributes).
get_env(Var) ->
case os:getenv(Var) of
false -> false;
Val -> unicode:characters_to_binary(Val)
end.