Packages
caffeine_lang
4.4.3
6.3.1
6.3.0
6.2.2
6.2.1
6.2.0
6.1.2
6.1.1
6.1.0
6.0.0
5.6.0
5.5.0
5.4.4
5.4.3
5.4.2
5.4.1
5.4.0
5.3.0
5.2.0
5.1.1
5.1.0
5.0.12
5.0.11
5.0.10
5.0.8
5.0.7
5.0.6
5.0.5
5.0.4
5.0.1
5.0.0
4.10.0
4.9.0
4.8.3
4.8.2
4.8.1
4.8.0
4.7.9
4.7.8
4.7.7
4.7.6
4.7.5
4.6.7
4.6.6
4.6.5
4.6.4
4.6.3
4.6.2
4.6.0
4.5.1
4.5.0
4.4.4
4.4.3
4.4.1
4.4.0
4.3.7
4.3.6
3.0.6
3.0.5
3.0.4
3.0.3
3.0.2
3.0.1
3.0.0
2.0.5
2.0.4
2.0.3
2.0.2
2.0.1
2.0.0
1.0.2
1.0.1
0.1.0
0.0.24
0.0.23
0.0.22
0.0.21
0.0.20
0.0.19
0.0.18
0.0.17
0.0.16
0.0.15
0.0.14
0.0.13
0.0.12
0.0.11
0.0.10
0.0.9
0.0.8
0.0.7
0.0.6
0.0.5
0.0.4
0.0.2
0.0.1
A compiler for generating reliability artifacts from service expectation definitions.
Current section
Files
Jump to
Current section
Files
src/caffeine_lang@codegen@honeycomb.erl
-module(caffeine_lang@codegen@honeycomb).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/caffeine_lang/codegen/honeycomb.gleam").
-export([terraform_settings/0, provider/0, variables/0, window_to_time_period/1, ir_to_terraform_resources/1, generate_resources/1, generate_terraform/1]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
-file("src/caffeine_lang/codegen/honeycomb.gleam", 40).
?DOC(false).
-spec terraform_settings() -> terra_madre@terraform:terraform_settings().
terraform_settings() ->
caffeine_lang@codegen@generator_utils:build_terraform_settings(
<<"honeycombio"/utf8>>,
<<"honeycombio/honeycombio"/utf8>>,
<<"~> 0.31"/utf8>>
).
-file("src/caffeine_lang/codegen/honeycomb.gleam", 50).
?DOC(false).
-spec provider() -> terra_madre@terraform:provider().
provider() ->
caffeine_lang@codegen@generator_utils:build_provider(
<<"honeycombio"/utf8>>,
[{<<"api_key"/utf8>>,
terra_madre@hcl:ref(<<"var.honeycomb_api_key"/utf8>>)}]
).
-file("src/caffeine_lang/codegen/honeycomb.gleam", 59).
?DOC(false).
-spec variables() -> list(terra_madre@terraform:variable()).
variables() ->
[{variable,
<<"honeycomb_api_key"/utf8>>,
{some, {identifier, <<"string"/utf8>>}},
none,
{some, <<"Honeycomb API key"/utf8>>},
{some, true},
none,
[]},
{variable,
<<"honeycomb_dataset"/utf8>>,
{some, {identifier, <<"string"/utf8>>}},
none,
{some, <<"Honeycomb dataset slug"/utf8>>},
none,
none,
[]}].
-file("src/caffeine_lang/codegen/honeycomb.gleam", 193).
?DOC(
" Collapse tag pairs that share the same key by joining values with commas.\n"
" The shared helper produces one pair per misc value, but Honeycomb needs a\n"
" single key-value entry per tag key. Preserves insertion order of first occurrence.\n"
).
-spec collapse_multi_value_tags(list({binary(), binary()})) -> list({binary(),
binary()}).
collapse_multi_value_tags(Pairs) ->
{Order, Merged} = begin
_pipe = Pairs,
gleam@list:fold(
_pipe,
{[], maps:new()},
fun(Acc, Pair) ->
{Keys, Seen} = Acc,
{Key, Value} = Pair,
case gleam_stdlib:map_get(Seen, Key) of
{ok, Existing} ->
{Keys,
gleam@dict:insert(
Seen,
Key,
<<<<Existing/binary, ","/utf8>>/binary,
Value/binary>>
)};
{error, _} ->
{[Key | Keys], gleam@dict:insert(Seen, Key, Value)}
end
end
)
end,
_pipe@1 = Order,
_pipe@2 = lists:reverse(_pipe@1),
gleam@list:filter_map(
_pipe@2,
fun(Key@1) -> _pipe@3 = gleam_stdlib:map_get(Merged, Key@1),
gleam@result:map(_pipe@3, fun(Value@1) -> {Key@1, Value@1} end) end
).
-file("src/caffeine_lang/codegen/honeycomb.gleam", 162).
?DOC(
" Build tags as a map expression for Honeycomb.\n"
" Honeycomb uses a map of string to string for tags.\n"
).
-spec build_tags(caffeine_lang@linker@ir:intermediate_representation()) -> terra_madre@hcl:expr().
build_tags(Ir) ->
System_tag_pairs = begin
_pipe = caffeine_lang@helpers:build_system_tag_pairs(
erlang:element(3, erlang:element(2, Ir)),
erlang:element(6, erlang:element(2, Ir)),
erlang:element(4, erlang:element(2, Ir)),
erlang:element(5, erlang:element(2, Ir)),
erlang:element(2, erlang:element(2, Ir)),
[],
erlang:element(7, erlang:element(2, Ir))
),
collapse_multi_value_tags(_pipe)
end,
User_tag_pairs = case caffeine_lang@linker@ir:get_slo_fields(
erlang:element(6, Ir)
) of
{some, Slo} ->
erlang:element(6, Slo);
none ->
[]
end,
All_tags = begin
_pipe@1 = lists:append(System_tag_pairs, User_tag_pairs),
gleam@list:map(
_pipe@1,
fun(Pair) ->
{{ident_key, erlang:element(1, Pair)},
{string_literal, erlang:element(2, Pair)}}
end
)
end,
{map_expr, All_tags}.
-file("src/caffeine_lang/codegen/honeycomb.gleam", 221).
?DOC(false).
-spec window_to_time_period(integer()) -> integer().
window_to_time_period(Days) ->
Days.
-file("src/caffeine_lang/codegen/honeycomb.gleam", 85).
?DOC(false).
-spec ir_to_terraform_resources(
caffeine_lang@linker@ir:intermediate_representation()
) -> {ok, list(terra_madre@terraform:resource())} |
{error, caffeine_lang@errors:compilation_error()}.
ir_to_terraform_resources(Ir) ->
Resource_name = terra_madre@common:sanitize_terraform_identifier(
erlang:element(3, Ir)
),
gleam@result:'try'(
caffeine_lang@codegen@generator_utils:require_slo_fields(
Ir,
<<"honeycomb"/utf8>>
),
fun(Slo) ->
Threshold = erlang:element(2, Slo),
Window_in_days = erlang:element(4, Slo),
Indicators = erlang:element(3, Slo),
gleam@result:'try'(
caffeine_lang@codegen@generator_utils:require_evaluation(
Slo,
Ir,
<<"honeycomb"/utf8>>
),
fun(Evaluation_expr) ->
gleam@result:'try'(
caffeine_lang@codegen@generator_utils:resolve_cql_expression(
Evaluation_expr,
Indicators,
Ir,
<<"honeycomb"/utf8>>
),
fun(Sli_expression) ->
Time_period = window_to_time_period(Window_in_days),
Derived_column_alias = <<Resource_name/binary,
"_sli"/utf8>>,
Derived_column = {resource,
<<"honeycombio_derived_column"/utf8>>,
Derived_column_alias,
maps:from_list(
[{<<"alias"/utf8>>,
{string_literal,
Derived_column_alias}},
{<<"expression"/utf8>>,
{string_literal, Sli_expression}},
{<<"dataset"/utf8>>,
terra_madre@hcl:ref(
<<"var.honeycomb_dataset"/utf8>>
)}]
),
[],
terra_madre@hcl:empty_meta(),
none},
Slo_description = caffeine_lang@codegen@generator_utils:build_description(
Ir,
Slo
),
Slo_attributes = [{<<"name"/utf8>>,
{string_literal,
erlang:element(2, erlang:element(2, Ir))}},
{<<"description"/utf8>>,
{string_literal, Slo_description}},
{<<"dataset"/utf8>>,
terra_madre@hcl:ref(
<<"var.honeycomb_dataset"/utf8>>
)},
{<<"sli"/utf8>>,
terra_madre@hcl:ref(
<<<<"honeycombio_derived_column."/utf8,
Derived_column_alias/binary>>/binary,
".alias"/utf8>>
)},
{<<"target_percentage"/utf8>>,
{float_literal, Threshold}},
{<<"time_period"/utf8>>,
{int_literal, Time_period}},
{<<"tags"/utf8>>, build_tags(Ir)}],
Slo@1 = {resource,
<<"honeycombio_slo"/utf8>>,
Resource_name,
maps:from_list(Slo_attributes),
[],
terra_madre@hcl:empty_meta(),
none},
{ok, [Derived_column, Slo@1]}
end
)
end
)
end
).
-file("src/caffeine_lang/codegen/honeycomb.gleam", 29).
?DOC(false).
-spec generate_resources(
list(caffeine_lang@linker@ir:intermediate_representation())
) -> {ok, {list(terra_madre@terraform:resource()), list(binary())}} |
{error, caffeine_lang@errors:compilation_error()}.
generate_resources(Irs) ->
caffeine_lang@codegen@generator_utils:generate_resources_multi(
Irs,
fun ir_to_terraform_resources/1
).
-file("src/caffeine_lang/codegen/honeycomb.gleam", 15).
?DOC(" Generate Terraform HCL from a list of Honeycomb IntermediateRepresentations.\n").
-spec generate_terraform(
list(caffeine_lang@linker@ir:intermediate_representation())
) -> {ok, binary()} | {error, caffeine_lang@errors:compilation_error()}.
generate_terraform(Irs) ->
caffeine_lang@codegen@generator_utils:generate_terraform(
Irs,
terraform_settings(),
provider(),
variables(),
fun generate_resources/1
).