Skip to main content

src/datadog_client@metric.erl

-module(datadog_client@metric).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/datadog_client/metric.gleam").
-export([gauge/2, count/2, rate/2, with_tags/2, add_tag/2, with_host/2, with_type/2, with_interval/2, with_points/2, add_point/3, to_json/1]).
-export_type([point/0, metric_type/0, metric/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 point() :: {point, integer(), float()}.

-type metric_type() :: gauge | count | rate.

-opaque metric() :: {metric,
        binary(),
        metric_type(),
        list(point()),
        list(binary()),
        gleam@option:option(binary()),
        gleam@option:option(integer())}.

-file("src/datadog_client/metric.gleam", 47).
-spec build(binary(), metric_type(), float()) -> metric().
build(Name, Kind, Value) ->
    {metric,
        Name,
        Kind,
        [{point, datadog_client@common:now_seconds(), Value}],
        [],
        none,
        none}.

-file("src/datadog_client/metric.gleam", 33).
?DOC(" Gauge metric at the current time.\n").
-spec gauge(binary(), float()) -> metric().
gauge(Name, Value) ->
    build(Name, gauge, Value).

-file("src/datadog_client/metric.gleam", 38).
?DOC(" Count metric at the current time.\n").
-spec count(binary(), float()) -> metric().
count(Name, Value) ->
    build(Name, count, Value).

-file("src/datadog_client/metric.gleam", 43).
?DOC(" Rate metric at the current time. Set the interval with `with_interval`.\n").
-spec rate(binary(), float()) -> metric().
rate(Name, Value) ->
    build(Name, rate, Value).

-file("src/datadog_client/metric.gleam", 61).
?DOC(" Replace the metric's tags.\n").
-spec with_tags(metric(), list(binary())) -> metric().
with_tags(Metric, Tags) ->
    {metric,
        erlang:element(2, Metric),
        erlang:element(3, Metric),
        erlang:element(4, Metric),
        Tags,
        erlang:element(6, Metric),
        erlang:element(7, Metric)}.

-file("src/datadog_client/metric.gleam", 66).
?DOC(" Append a single tag.\n").
-spec add_tag(metric(), binary()) -> metric().
add_tag(Metric, Tag) ->
    {metric,
        erlang:element(2, Metric),
        erlang:element(3, Metric),
        erlang:element(4, Metric),
        [Tag | erlang:element(5, Metric)],
        erlang:element(6, Metric),
        erlang:element(7, Metric)}.

-file("src/datadog_client/metric.gleam", 71).
?DOC(" Set the reporting host.\n").
-spec with_host(metric(), binary()) -> metric().
with_host(Metric, Host) ->
    {metric,
        erlang:element(2, Metric),
        erlang:element(3, Metric),
        erlang:element(4, Metric),
        erlang:element(5, Metric),
        {some, Host},
        erlang:element(7, Metric)}.

-file("src/datadog_client/metric.gleam", 76).
?DOC(" Set the metric type (gauge/count/rate).\n").
-spec with_type(metric(), metric_type()) -> metric().
with_type(Metric, Kind) ->
    {metric,
        erlang:element(2, Metric),
        Kind,
        erlang:element(4, Metric),
        erlang:element(5, Metric),
        erlang:element(6, Metric),
        erlang:element(7, Metric)}.

-file("src/datadog_client/metric.gleam", 81).
?DOC(" Set the flush interval in seconds (required for `Rate`).\n").
-spec with_interval(metric(), integer()) -> metric().
with_interval(Metric, Seconds) ->
    {metric,
        erlang:element(2, Metric),
        erlang:element(3, Metric),
        erlang:element(4, Metric),
        erlang:element(5, Metric),
        erlang:element(6, Metric),
        {some, Seconds}}.

-file("src/datadog_client/metric.gleam", 86).
?DOC(" Replace all points.\n").
-spec with_points(metric(), list(point())) -> metric().
with_points(Metric, Points) ->
    {metric,
        erlang:element(2, Metric),
        erlang:element(3, Metric),
        Points,
        erlang:element(5, Metric),
        erlang:element(6, Metric),
        erlang:element(7, Metric)}.

-file("src/datadog_client/metric.gleam", 91).
?DOC(" Append a single point at the given timestamp.\n").
-spec add_point(metric(), integer(), float()) -> metric().
add_point(Metric, Timestamp, Value) ->
    {metric,
        erlang:element(2, Metric),
        erlang:element(3, Metric),
        [{point, Timestamp, Value} | erlang:element(4, Metric)],
        erlang:element(5, Metric),
        erlang:element(6, Metric),
        erlang:element(7, Metric)}.

-file("src/datadog_client/metric.gleam", 121).
-spec point_to_json(point()) -> gleam@json:json().
point_to_json(Point) ->
    gleam@json:preprocessed_array(
        [gleam@json:int(erlang:element(2, Point)),
            gleam@json:float(erlang:element(3, Point))]
    ).

-file("src/datadog_client/metric.gleam", 125).
-spec type_to_string(metric_type()) -> binary().
type_to_string(Kind) ->
    case Kind of
        gauge ->
            <<"gauge"/utf8>>;

        count ->
            <<"count"/utf8>>;

        rate ->
            <<"rate"/utf8>>
    end.

-file("src/datadog_client/metric.gleam", 101).
?DOC(" JSON object for a single metric, matching Datadog's v1 series schema.\n").
-spec to_json(metric()) -> gleam@json:json().
to_json(Metric) ->
    Base = [{<<"metric"/utf8>>, gleam@json:string(erlang:element(2, Metric))},
        {<<"type"/utf8>>,
            gleam@json:string(type_to_string(erlang:element(3, Metric)))},
        {<<"points"/utf8>>,
            gleam@json:array(erlang:element(4, Metric), fun point_to_json/1)},
        {<<"tags"/utf8>>,
            gleam@json:array(erlang:element(5, Metric), fun gleam@json:string/1)}],
    With_host_field = case erlang:element(6, Metric) of
        {some, H} ->
            [{<<"host"/utf8>>, gleam@json:string(H)} | Base];

        none ->
            Base
    end,
    _pipe = case erlang:element(7, Metric) of
        {some, I} ->
            [{<<"interval"/utf8>>, gleam@json:int(I)} | With_host_field];

        none ->
            With_host_field
    end,
    gleam@json:object(_pipe).