Packages
caffeine_lang
4.3.7
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", 43).
?DOC(false).
-spec terraform_settings() -> terra_madre@terraform:terraform_settings().
terraform_settings() ->
{terraform_settings,
none,
maps:from_list(
[{<<"honeycombio"/utf8>>,
{provider_requirement,
<<"honeycombio/honeycombio"/utf8>>,
{some, <<"~> 0.31"/utf8>>}}}]
),
none,
none}.
-file("src/caffeine_lang/codegen/honeycomb.gleam", 62).
?DOC(false).
-spec provider() -> terra_madre@terraform:provider().
provider() ->
{provider,
<<"honeycombio"/utf8>>,
none,
maps:from_list(
[{<<"api_key"/utf8>>,
terra_madre@hcl:ref(<<"var.honeycomb_api_key"/utf8>>)}]
),
[]}.
-file("src/caffeine_lang/codegen/honeycomb.gleam", 75).
?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", 191).
?DOC(" Build a description string for the SLO.\n").
-spec build_description(caffeine_lang@linker@ir:intermediate_representation()) -> binary().
build_description(Ir) ->
Runbook = case caffeine_lang@linker@ir:get_slo_fields(erlang:element(6, Ir)) of
{some, Slo} ->
erlang:element(7, Slo);
none ->
none
end,
case Runbook of
{some, Url} ->
<<<<"[Runbook]("/utf8, Url/binary>>/binary, ")"/utf8>>;
none ->
<<<<<<<<<<<<"Managed by Caffeine ("/utf8,
(erlang:element(3, erlang:element(2, Ir)))/binary>>/binary,
"/"/utf8>>/binary,
(erlang:element(6, erlang:element(2, Ir)))/binary>>/binary,
"/"/utf8>>/binary,
(erlang:element(4, erlang:element(2, Ir)))/binary>>/binary,
")"/utf8>>
end.
-file("src/caffeine_lang/codegen/honeycomb.gleam", 243).
?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", 212).
?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", 271).
?DOC(false).
-spec window_to_time_period(integer()) -> integer().
window_to_time_period(Days) ->
Days.
-file("src/caffeine_lang/codegen/honeycomb.gleam", 101).
?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) ->
Identifier = caffeine_lang@linker@ir:ir_to_identifier(Ir),
Resource_name = terra_madre@common:sanitize_terraform_identifier(
erlang:element(3, Ir)
),
gleam@result:'try'(
begin
_pipe = caffeine_lang@linker@ir:get_slo_fields(
erlang:element(6, Ir)
),
gleam@option:to_result(
_pipe,
{generator_terraform_resolution_error,
<<"honeycomb"/utf8>>,
<<<<"expectation '"/utf8, Identifier/binary>>/binary,
"' - missing SLO artifact data"/utf8>>,
caffeine_lang@errors:empty_context()}
)
end,
fun(Slo) ->
Threshold = erlang:element(2, Slo),
Window_in_days = erlang:element(4, Slo),
Indicators = erlang:element(3, Slo),
gleam@result:'try'(
begin
_pipe@1 = erlang:element(5, Slo),
gleam@option:to_result(
_pipe@1,
{generator_terraform_resolution_error,
<<"honeycomb"/utf8>>,
<<<<"expectation '"/utf8, Identifier/binary>>/binary,
"' - missing evaluation for Honeycomb SLO"/utf8>>,
caffeine_lang@errors:empty_context()}
)
end,
fun(Evaluation_expr) ->
gleam@result:'try'(
begin
_pipe@2 = caffeine_query_language@generator:resolve_slo_to_expression(
Evaluation_expr,
Indicators
),
gleam@result:map_error(
_pipe@2,
fun(Err) ->
{generator_terraform_resolution_error,
<<"honeycomb"/utf8>>,
<<<<<<"expectation '"/utf8,
Identifier/binary>>/binary,
"' - "/utf8>>/binary,
Err/binary>>,
caffeine_lang@errors:empty_context()}
end
)
end,
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 = build_description(Ir),
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", 32).
?DOC(false).
-spec generate_resources(
list(caffeine_lang@linker@ir:intermediate_representation())
) -> {ok, list(terra_madre@terraform:resource())} |
{error, caffeine_lang@errors:compilation_error()}.
generate_resources(Irs) ->
gleam@result:'try'(
begin
_pipe = Irs,
gleam@list:try_map(_pipe, fun ir_to_terraform_resources/1)
end,
fun(Resource_lists) -> {ok, lists:append(Resource_lists)} end
).
-file("src/caffeine_lang/codegen/honeycomb.gleam", 18).
?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) ->
gleam@result:'try'(
generate_resources(Irs),
fun(Resources) ->
{ok,
caffeine_lang@codegen@generator_utils:render_terraform_config(
Resources,
terraform_settings(),
[provider()],
variables()
)}
end
).