Skip to content

Commit

Permalink
Fixing MFA for GrafanaAgent config
Browse files Browse the repository at this point in the history
  • Loading branch information
akoutmos committed Aug 10, 2024
1 parent 6cad20a commit 6569b26
Show file tree
Hide file tree
Showing 6 changed files with 55 additions and 65 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Fixed

- Pool size and timeout duration panels in Ecto dashboard [#223](https://github.com/akoutmos/prom_ex/pull/223).
- MFA invocation for GrafanaAgent configuration file creation.

### Changed

Expand Down
10 changes: 7 additions & 3 deletions lib/prom_ex/config.ex
Original file line number Diff line number Diff line change
Expand Up @@ -325,17 +325,21 @@ defmodule PromEx.Config do
%{
version: Keyword.get(grafana_agent_opts, :version, Downloader.default_version()),
working_directory: Keyword.get(grafana_agent_opts, :working_directory),
config_opts: grafana_agent_opts |> get_grafana_agent_config(:config_opts) |> extract_opts_for_config()
config_opts: grafana_agent_opts |> Keyword.get(:config_opts) |> extract_opts_for_config()
}
end

defp extract_opts_for_config({_m, _f, _a} = mfa) do
mfa
end

defp extract_opts_for_config(opts) do
%{
scrape_interval: "15s",
bearer_token: "blank",
log_level: "error",
agent_port: "4040",
grpc_port: "9095",
agent_port: "12345",
grpc_port: "123456",
job: nil,
instance: nil,
prometheus_url: get_grafana_agent_config(opts, :prometheus_url),
Expand Down
68 changes: 42 additions & 26 deletions lib/prom_ex/grafana_agent.ex
Original file line number Diff line number Diff line change
Expand Up @@ -74,25 +74,37 @@ defmodule PromEx.GrafanaAgent do
%{
port_wrapper_path: port_wrapper_path,
binary_path: binary_path,
config_file_path: config_file_path,
grafana_agent_config: %{
config_opts: %{
agent_port: agent_port,
grpc_port: grpc_port
}
}
config_file_path: config_file_path
} = state
) do
Logger.info("Starting GrafanaAgent")

wrapper_args = [binary_path, "-config.file", config_file_path]

wrapper_args =
if pre_v0_26?(state) do
wrapper_args
else
wrapper_args ++
["-server.http.address", "127.0.0.1:#{agent_port}", "-server.grpc.address", "127.0.0.1:#{grpc_port}"]
case state do
%{
grafana_agent_config: %{
config_opts: %{
agent_port: agent_port,
grpc_port: grpc_port
}
}
} ->
[
binary_path,
"-config.file",
config_file_path,
"-server.http.address",
"127.0.0.1:#{agent_port}",
"-server.grpc.address",
"127.0.0.1:#{grpc_port}"
]

_ ->
[
binary_path,
"-config.file",
config_file_path
]
end

{:spawn_executable, port_wrapper_path}
Expand Down Expand Up @@ -144,7 +156,7 @@ defmodule PromEx.GrafanaAgent do
bin_dir
|> File.ls!()
|> Enum.find_value(fn file ->
if Regex.match?(~r/agent-(?:linux|darwin|freebsd|windows)-(?:amd64|arm64)/, file) do
if Regex.match?(~r/grafana-agent-(?:linux|darwin|freebsd|windows)-(?:amd64|arm64)/, file) do
Path.join(bin_dir, file)
else
nil
Expand All @@ -156,22 +168,28 @@ defmodule PromEx.GrafanaAgent do
# Get the root path where all GrafanaAgent related items will reside
base_directory = get_base_directory(state)

# Create the necessary directory structure in the base dir
config_dir = Path.join(base_directory, "/config")
File.mkdir_p!(config_dir)

# Create the necessary directory structure in the base dir
wal_dir = Path.join(base_directory, "/prom_wal")
File.mkdir_p!(wal_dir)

state
|> Map.get(:grafana_agent_config)
|> Map.get(:config_opts)
|> Map.put(:wal_dir, wal_dir)
|> Map.put(:render_listen_port, pre_v0_26?(state))
|> maybe_put_job(state)
|> maybe_put_instance()
|> ConfigRenderer.generate_config_file(config_dir)
|> case do
{module, function, arguments} ->
apply(module, function, arguments)

config_opts ->
# Create the necessary directory structure in the base dir
config_dir = Path.join(base_directory, "/config")
File.mkdir_p!(config_dir)

config_opts
|> Map.put(:wal_dir, wal_dir)
|> maybe_put_job(state)
|> maybe_put_instance()
|> ConfigRenderer.generate_config_file(config_dir)
end
end

defp maybe_put_job(%{job: nil} = opts, state) do
Expand All @@ -192,6 +210,4 @@ defmodule PromEx.GrafanaAgent do
defp maybe_put_instance(opts) do
opts
end

defp pre_v0_26?(%{grafana_agent_config: %{version: version}}), do: Version.compare(version, "0.26.0") == :lt
end
4 changes: 1 addition & 3 deletions priv/grafana_agent/default_config.yml.eex
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
server:
log_level: <%= @log_level %><%= if @render_listen_port do %>
http_listen_port: <%= @agent_port %>
grpc_listen_port: <%= @grpc_port %><% end %>
log_level: <%= @log_level %>

prometheus:
wal_directory: "<%= @wal_dir %>"
Expand Down
4 changes: 2 additions & 2 deletions test/prom_ex/config_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,8 @@ defmodule PromEx.ConfigTest do
scrape_interval: "15s",
bearer_token: "blank",
log_level: "error",
agent_port: "4040",
grpc_port: "9095",
agent_port: "12345",
grpc_port: "123456",
job: nil,
instance: nil,
metrics_server_path: "/metrics",
Expand Down
33 changes: 2 additions & 31 deletions test/prom_ex/grafana_agent/config_renderer_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -4,34 +4,6 @@ defmodule PromEx.GrafanaAgent.ConfigRendererTest do
alias PromEx.GrafanaAgent.ConfigRenderer

describe "generate_config_file/2" do
@tag :tmp_dir
test "should generate a configuration yaml file with the correct substitutions", %{tmp_dir: tmp_dir} do
template_args = %{
agent_port: "12345",
grpc_port: "54321",
render_listen_port: true,
log_level: "error",
wal_dir: "/tmp/test/wal",
scrape_interval: "5s",
job: "TestApp",
metrics_server_path: "/cool-metrics",
metrics_server_scheme: :https,
metrics_server_host: "localhost",
bearer_token: "super_secret",
metrics_server_port: "1234",
instance: "localhost",
prometheus_url: "www.my-prometheus.com",
prometheus_username: "prom_user",
prometheus_password: "prom_pass"
}

ConfigRenderer.generate_config_file(template_args, tmp_dir)
expected_file_path = "#{tmp_dir}/agent.yml"

assert File.exists?(expected_file_path)
assert File.read!(expected_file_path) == File.read!("#{__DIR__}/expected_output_config.yml")
end

@tag :tmp_dir
test "should configure template", %{tmp_dir: tmp_dir} do
template_file = Path.join(tmp_dir, "my_template.yml.eex")
Expand All @@ -50,11 +22,10 @@ defmodule PromEx.GrafanaAgent.ConfigRendererTest do
end

@tag :tmp_dir
test "should omnit agent_port and grpc_port from >= v0.26.0", %{tmp_dir: tmp_dir} do
test "should generate a configuration yaml file with the correct substitutions", %{tmp_dir: tmp_dir} do
template_args = %{
agent_port: "12345",
grpc_port: "54321",
render_listen_port: false,
grpc_port: "123456",
log_level: "error",
wal_dir: "/tmp/test/wal",
scrape_interval: "5s",
Expand Down

0 comments on commit 6569b26

Please sign in to comment.