Packages
caffeine_lang
4.5.0
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@newrelic.erl
-module(caffeine_lang@codegen@newrelic).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/caffeine_lang/codegen/newrelic.gleam").
-export([terraform_settings/0, provider/0, variables/0, parse_nrql_indicator/1, window_to_rolling_count/1, ir_to_terraform_resource/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/newrelic.gleam", 43).
?DOC(false).
-spec terraform_settings() -> terra_madre@terraform:terraform_settings().
terraform_settings() ->
caffeine_lang@codegen@generator_utils:build_terraform_settings(
<<"newrelic"/utf8>>,
<<"newrelic/newrelic"/utf8>>,
<<"~> 3.0"/utf8>>
).
-file("src/caffeine_lang/codegen/newrelic.gleam", 53).
?DOC(false).
-spec provider() -> terra_madre@terraform:provider().
provider() ->
caffeine_lang@codegen@generator_utils:build_provider(
<<"newrelic"/utf8>>,
[{<<"account_id"/utf8>>,
terra_madre@hcl:ref(<<"var.newrelic_account_id"/utf8>>)},
{<<"api_key"/utf8>>,
terra_madre@hcl:ref(<<"var.newrelic_api_key"/utf8>>)},
{<<"region"/utf8>>,
terra_madre@hcl:ref(<<"var.newrelic_region"/utf8>>)}]
).
-file("src/caffeine_lang/codegen/newrelic.gleam", 63).
?DOC(false).
-spec variables() -> list(terra_madre@terraform:variable()).
variables() ->
[{variable,
<<"newrelic_account_id"/utf8>>,
{some, {identifier, <<"number"/utf8>>}},
none,
{some, <<"New Relic account ID"/utf8>>},
none,
none,
[]},
{variable,
<<"newrelic_api_key"/utf8>>,
{some, {identifier, <<"string"/utf8>>}},
none,
{some, <<"New Relic API key"/utf8>>},
{some, true},
none,
[]},
{variable,
<<"newrelic_region"/utf8>>,
{some, {identifier, <<"string"/utf8>>}},
{some, {string_literal, <<"US"/utf8>>}},
{some, <<"New Relic region"/utf8>>},
none,
none,
[]},
{variable,
<<"newrelic_entity_guid"/utf8>>,
{some, {identifier, <<"string"/utf8>>}},
none,
{some, <<"New Relic entity GUID"/utf8>>},
none,
none,
[]}].
-file("src/caffeine_lang/codegen/newrelic.gleam", 247).
?DOC(
" Extract good and valid indicator names from the evaluation expression.\n"
" Expects a \"numerator / denominator\" pattern where numerator = good, denominator = valid.\n"
).
-spec extract_good_valid_names(binary(), list(binary()), binary()) -> {ok,
{binary(), binary()}} |
{error, caffeine_lang@errors:compilation_error()}.
extract_good_valid_names(Evaluation_expr, Indicator_names, Identifier) ->
case gleam@string:split(Evaluation_expr, <<" / "/utf8>>) of
[Good, Valid] ->
Good_trimmed = gleam@string:trim(Good),
Valid_trimmed = gleam@string:trim(Valid),
case gleam@list:contains(Indicator_names, Good_trimmed) andalso gleam@list:contains(
Indicator_names,
Valid_trimmed
) of
true ->
{ok, {Good_trimmed, Valid_trimmed}};
false ->
{error,
caffeine_lang@codegen@generator_utils:resolution_error(
<<"newrelic"/utf8>>,
<<<<"expectation '"/utf8, Identifier/binary>>/binary,
"' - evaluation references indicators not found in indicator map"/utf8>>
)}
end;
_ ->
{error,
caffeine_lang@codegen@generator_utils:resolution_error(
<<"newrelic"/utf8>>,
<<<<"expectation '"/utf8, Identifier/binary>>/binary,
"' - evaluation must be in 'good / valid' format for New Relic"/utf8>>
)}
end.
-file("src/caffeine_lang/codegen/newrelic.gleam", 283).
?DOC(false).
-spec parse_nrql_indicator(binary()) -> {binary(),
gleam@option:option(binary())}.
parse_nrql_indicator(Indicator) ->
case gleam@string:split(Indicator, <<" WHERE "/utf8>>) of
[From] ->
{From, none};
[From@1 | Rest] ->
{From@1, {some, gleam@string:join(Rest, <<" WHERE "/utf8>>)}};
_ ->
{Indicator, none}
end.
-file("src/caffeine_lang/codegen/newrelic.gleam", 294).
?DOC(" Build an NRQL event sub-block (good_events or valid_events).\n").
-spec build_nrql_event_block(binary(), binary(), gleam@option:option(binary())) -> terra_madre@hcl:block().
build_nrql_event_block(Block_type, From, Where_clause) ->
Attrs = case Where_clause of
{some, Where} ->
[{<<"from"/utf8>>, {string_literal, From}},
{<<"where"/utf8>>, {string_literal, Where}}];
none ->
[{<<"from"/utf8>>, {string_literal, From}}]
end,
{block, Block_type, [], maps:from_list(Attrs), []}.
-file("src/caffeine_lang/codegen/newrelic.gleam", 188).
?DOC(
" Build the events block from indicators and evaluation expression.\n"
" Determines which indicators map to valid_events and good_events based\n"
" on the evaluation expression structure (numerator = good, denominator = valid).\n"
).
-spec build_events_block(
gleam@dict:dict(binary(), binary()),
binary(),
binary()
) -> {ok, terra_madre@hcl:block()} |
{error, caffeine_lang@errors:compilation_error()}.
build_events_block(Indicators, Evaluation_expr, Identifier) ->
Indicator_names = maps:keys(Indicators),
gleam@result:'try'(
extract_good_valid_names(Evaluation_expr, Indicator_names, Identifier),
fun(_use0) ->
{Good_name, Valid_name} = _use0,
gleam@result:'try'(
begin
_pipe = gleam_stdlib:map_get(Indicators, Good_name),
gleam@result:replace_error(
_pipe,
caffeine_lang@codegen@generator_utils:resolution_error(
<<"newrelic"/utf8>>,
<<<<<<<<"expectation '"/utf8, Identifier/binary>>/binary,
"' - indicator '"/utf8>>/binary,
Good_name/binary>>/binary,
"' not found"/utf8>>
)
)
end,
fun(Good_indicator) ->
gleam@result:'try'(
begin
_pipe@1 = gleam_stdlib:map_get(
Indicators,
Valid_name
),
gleam@result:replace_error(
_pipe@1,
caffeine_lang@codegen@generator_utils:resolution_error(
<<"newrelic"/utf8>>,
<<<<<<<<"expectation '"/utf8,
Identifier/binary>>/binary,
"' - indicator '"/utf8>>/binary,
Valid_name/binary>>/binary,
"' not found"/utf8>>
)
)
end,
fun(Valid_indicator) ->
{Good_from, Good_where} = parse_nrql_indicator(
Good_indicator
),
{Valid_from, Valid_where} = parse_nrql_indicator(
Valid_indicator
),
Good_events_block = build_nrql_event_block(
<<"good_events"/utf8>>,
Good_from,
Good_where
),
Valid_events_block = build_nrql_event_block(
<<"valid_events"/utf8>>,
Valid_from,
Valid_where
),
{ok,
{block,
<<"events"/utf8>>,
[],
maps:from_list(
[{<<"account_id"/utf8>>,
terra_madre@hcl:ref(
<<"var.newrelic_account_id"/utf8>>
)}]
),
[Valid_events_block, Good_events_block]}}
end
)
end
)
end
).
-file("src/caffeine_lang/codegen/newrelic.gleam", 317).
?DOC(false).
-spec window_to_rolling_count(integer()) -> {ok, integer()} |
{error, caffeine_lang@errors:compilation_error()}.
window_to_rolling_count(Days) ->
case Days of
1 ->
{ok, Days};
7 ->
{ok, Days};
28 ->
{ok, Days};
_ ->
{error,
caffeine_lang@codegen@generator_utils:resolution_error(
<<"newrelic"/utf8>>,
<<<<"Illegal window_in_days value: "/utf8,
(erlang:integer_to_binary(Days))/binary>>/binary,
". New Relic accepts only 1, 7, or 28."/utf8>>
)}
end.
-file("src/caffeine_lang/codegen/newrelic.gleam", 107).
?DOC(false).
-spec ir_to_terraform_resource(
caffeine_lang@linker@ir:intermediate_representation()
) -> {ok, terra_madre@terraform:resource()} |
{error, caffeine_lang@errors:compilation_error()}.
ir_to_terraform_resource(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'(
caffeine_lang@codegen@generator_utils:require_slo_fields(
Ir,
<<"newrelic"/utf8>>
),
fun(Slo) ->
gleam@result:'try'(
caffeine_lang@codegen@generator_utils:require_evaluation(
Slo,
Ir,
<<"newrelic"/utf8>>
),
fun(Evaluation_expr) ->
gleam@result:'try'(
caffeine_lang@codegen@generator_utils:resolve_cql_expression(
Evaluation_expr,
erlang:element(3, Slo),
Ir,
<<"newrelic"/utf8>>
),
fun(_) ->
gleam@result:'try'(
begin
_pipe = window_to_rolling_count(
erlang:element(4, Slo)
),
gleam@result:map_error(
_pipe,
fun(Err) ->
caffeine_lang@errors:prefix_error(
Err,
Identifier
)
end
)
end,
fun(Rolling_count) ->
gleam@result:'try'(
build_events_block(
erlang:element(3, Slo),
Evaluation_expr,
Identifier
),
fun(Events_block) ->
Description = caffeine_lang@codegen@generator_utils:build_description(
Ir,
Slo
),
Resource = {resource,
<<"newrelic_service_level"/utf8>>,
Resource_name,
maps:from_list(
[{<<"guid"/utf8>>,
terra_madre@hcl:ref(
<<"var.newrelic_entity_guid"/utf8>>
)},
{<<"name"/utf8>>,
{string_literal,
erlang:element(
2,
erlang:element(
2,
Ir
)
)}},
{<<"description"/utf8>>,
{string_literal,
Description}}]
),
[Events_block,
{block,
<<"objective"/utf8>>,
[],
maps:from_list(
[{<<"target"/utf8>>,
{float_literal,
erlang:element(
2,
Slo
)}}]
),
[{block,
<<"time_window"/utf8>>,
[],
maps:new(),
[terra_madre@hcl:simple_block(
<<"rolling"/utf8>>,
[{<<"count"/utf8>>,
{int_literal,
Rolling_count}},
{<<"unit"/utf8>>,
{string_literal,
<<"DAY"/utf8>>}}]
)]}]}],
terra_madre@hcl:empty_meta(),
none},
{ok, Resource}
end
)
end
)
end
)
end
)
end
).
-file("src/caffeine_lang/codegen/newrelic.gleam", 32).
?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_simple(
Irs,
fun ir_to_terraform_resource/1
).
-file("src/caffeine_lang/codegen/newrelic.gleam", 18).
?DOC(" Generate Terraform HCL from a list of New Relic 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
).