Skip to main content

src/datadog_client.erl

-module(datadog_client).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/datadog_client.gleam").
-export([new/1, with_site/2, encode_to_json/1, to_request/2, send/2, send_one/2]).
-export_type([client/0, send_error/0]).

-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.

-type client() :: {client, binary(), binary()}.

-type send_error() :: {http_error, binary()} | {api_error, integer(), binary()}.

-file("src/datadog_client.gleam", 35).
?DOC(" Build a client for the default site (`datadoghq.com`).\n").
-spec new(binary()) -> client().
new(Api_key) ->
    {client, Api_key, <<"datadoghq.com"/utf8>>}.

-file("src/datadog_client.gleam", 40).
?DOC(" Override the Datadog site (e.g. `\"datadoghq.eu\"`).\n").
-spec with_site(client(), binary()) -> client().
with_site(Client, Site) ->
    {client, erlang:element(2, Client), Site}.

-file("src/datadog_client.gleam", 124).
?DOC(false).
-spec encode_to_json(list(datadog_client@metric:metric())) -> binary().
encode_to_json(Metrics) ->
    _pipe = gleam@json:object(
        [{<<"series"/utf8>>,
                gleam@json:array(Metrics, fun datadog_client@metric:to_json/1)}]
    ),
    gleam@json:to_string(_pipe).

-file("src/datadog_client.gleam", 48).
?DOC(
    " Build the HTTPS request body for `/api/v1/series` without sending it.\n"
    " Use this if you want to send via your own HTTP backend.\n"
).
-spec to_request(client(), list(datadog_client@metric:metric())) -> gleam@http@request:request(binary()).
to_request(Client, Metrics) ->
    _pipe = gleam@http@request:new(),
    _pipe@1 = gleam@http@request:set_method(_pipe, post),
    _pipe@2 = gleam@http@request:set_scheme(_pipe@1, https),
    _pipe@3 = gleam@http@request:set_host(
        _pipe@2,
        <<"api."/utf8, (erlang:element(3, Client))/binary>>
    ),
    _pipe@4 = gleam@http@request:set_path(_pipe@3, <<"/api/v1/series"/utf8>>),
    _pipe@5 = gleam@http@request:set_header(
        _pipe@4,
        <<"dd-api-key"/utf8>>,
        erlang:element(2, Client)
    ),
    _pipe@6 = gleam@http@request:set_header(
        _pipe@5,
        <<"content-type"/utf8>>,
        <<"application/json"/utf8>>
    ),
    gleam@http@request:set_body(_pipe@6, encode_to_json(Metrics)).

-file("src/datadog_client.gleam", 63).
?DOC(" POST one or more metrics to `/api/v1/series`. Erlang target.\n").
-spec send(client(), list(datadog_client@metric:metric())) -> {ok,
        gleam@http@response:response(binary())} |
    {error, send_error()}.
send(Client, Metrics) ->
    gleam@result:'try'(
        begin
            _pipe = gleam@httpc:send(to_request(Client, Metrics)),
            gleam@result:map_error(
                _pipe,
                fun(E) -> {http_error, gleam@string:inspect(E)} end
            )
        end,
        fun(Resp) -> case erlang:element(2, Resp) of
                S when (S >= 200) andalso (S < 300) ->
                    {ok, Resp};

                S@1 ->
                    {error, {api_error, S@1, erlang:element(4, Resp)}}
            end end
    ).

-file("src/datadog_client.gleam", 80).
?DOC(" Send a single metric. Convenience over `send`. Erlang target.\n").
-spec send_one(client(), datadog_client@metric:metric()) -> {ok,
        gleam@http@response:response(binary())} |
    {error, send_error()}.
send_one(Client, M) ->
    send(Client, [M]).