diff --git a/Dockerfile b/Dockerfile index cb66a94..d0f1612 100644 --- a/Dockerfile +++ b/Dockerfile @@ -14,12 +14,10 @@ # ARG DOCKER_IMAGE="hexpm/elixir:1.13.3-erlang-23.2.3-alpine-3.15.0" - - FROM ${DOCKER_IMAGE} as builder # install build dependencies -RUN apk add gcc git librdkafka-dev musl-dev +RUN apk add g++ # prepare build dir WORKDIR /app diff --git a/config/config.exs b/config/config.exs index f811459..728be9f 100644 --- a/config/config.exs +++ b/config/config.exs @@ -23,76 +23,6 @@ config :logger, :console, # Use Jason for JSON parsing in Phoenix config :phoenix, :json_library, Jason -config :kafka_ex, - # A list of brokers to connect to. This can be in either of the following formats - # - # * [{"HOST", port}...] - # * CSV - `"HOST:PORT,HOST:PORT[,...]"` - # * {mod, fun, args} - # * &arity_zero_fun/0 - # * fn -> ... end - # - # If you receive :leader_not_available - # errors when producing messages, it may be necessary to modify "advertised.host.name" in the - # server.properties file. - # In the case below you would set "advertised.host.name=localhost" - # brokers: [ - # {"kafka1", 9092}, - # {"kafka2", 9092}, - # {"kafka3", 9092} - # ], - # - # OR: - # brokers: "localhost:9092,localhost:9093,localhost:9094" - # - # It may be useful to configure your brokers at runtime, for example if you use - # service discovery instead of storing your broker hostnames in a config file. - # To do this, you can use `{mod, fun, args}` or a zero-arity function, and `KafkaEx` - # will invoke your callback when fetching the `:brokers` configuration. - # Note that when using this approach you must return a list of host/port pairs. - # - # the default consumer group for worker processes, must be a binary (string) - # NOTE if you are on Kafka < 0.8.2 or if you want to disable the use of - # consumer groups, set this to :no_consumer_group (this is the - # only exception to the requirement that this value be a binary) - consumer_group: "kafka_ex", - # The client_id is the logical grouping of a set of kafka clients. - client_id: "kafka_ex", - # Set this value to true if you do not want the default - # `KafkaEx.Server` worker to start during application start-up - - # i.e., if you want to start your own set of named workers - disable_default_worker: false, - # Timeout value, in msec, for synchronous operations (e.g., network calls). - # If this value is greater than GenServer's default timeout of 5000, it will also - # be used as the timeout for work dispatched via KafkaEx.Server.call (e.g., KafkaEx.metadata). - # In those cases, it should be considered a 'total timeout', encompassing both network calls and - # wait time for the genservers. - sync_timeout: 3000, - # Supervision max_restarts - the maximum amount of restarts allowed in a time frame - max_restarts: 10, - # Supervision max_seconds - the time frame in which :max_restarts applies - max_seconds: 60, - # Interval in milliseconds that GenConsumer waits to commit offsets. - commit_interval: 5_000, - # Threshold number of messages consumed for GenConsumer to commit offsets - # to the broker. - commit_threshold: 100, - # Interval in milliseconds to wait before reconnect to kafka - sleep_for_reconnect: 400, - # This is the flag that enables use of ssl - use_ssl: false, - # see SSL OPTION DESCRIPTIONS - CLIENT SIDE at http://erlang.org/doc/man/ssl.html - # for supported options - ssl_options: [ - # cacertfile: File.cwd!() <> "/ssl/ca-cert", - # certfile: File.cwd!() <> "/ssl/cert.pem", - # keyfile: File.cwd!() <> "/ssl/key.pem" - ], - # set this to the version of the kafka broker that you are using - # include only major.minor.patch versions. must be at least 0.8.0 - # use "kayrock" for the new client - kafka_version: "3.1.0" - # Import environment specific config. This must remain at the bottom # of this file so it overrides the configuration defined above. env_config = Path.expand("#{Mix.env()}.exs", __DIR__) diff --git a/config/runtime.exs b/config/runtime.exs index 3881aa5..ceccf19 100644 --- a/config/runtime.exs +++ b/config/runtime.exs @@ -38,13 +38,17 @@ if config_env() == :prod do # See `mix help release` for more information. end -{port, _} = - System.fetch_env!("KAFKA_BROKER_PORT") - |> Integer.parse() +brokers = + System.fetch_env!("KAFKA_BROKERS") + |> String.split(",") + |> Enum.map(fn x -> + [host, port] = String.split(x, ":") + {host, String.to_integer(port)} + end) -config :kafka_ex, - brokers: [ - {System.fetch_env!("KAFKA_BROKER1_HOST"), port}, - {System.fetch_env!("KAFKA_BROKER2_HOST"), port}, - {System.fetch_env!("KAFKA_BROKER3_HOST"), port} +config :brod, + clients: [ + kafka_client: [ + endpoints: brokers + ] ] diff --git a/config/test.exs b/config/test.exs index 231cba3..f59c699 100644 --- a/config/test.exs +++ b/config/test.exs @@ -13,10 +13,4 @@ config :logger, level: :warn # Initialize plugs at runtime for faster test compilation config :phoenix, :plug_init_mode, :runtime -config :kafka_ex, - disable_default_worker: true - -System.put_env("KAFKA_BROKER1_HOST", "localhost") -System.put_env("KAFKA_BROKER2_HOST", "localhost") -System.put_env("KAFKA_BROKER3_HOST", "localhost") -System.put_env("KAFKA_BROKER_PORT", "9092") +System.put_env("KAFKA_BROKERS", "test-host:9092") diff --git a/docker-compose.yml b/docker-compose.yml index 0bd10c8..11e6cf0 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -95,10 +95,7 @@ services: ports: - '4000:4000' environment: - - KAFKA_BROKER1_HOST=kafka1 - - KAFKA_BROKER2_HOST=kafka2 - - KAFKA_BROKER3_HOST=kafka2 - - KAFKA_BROKER_PORT=9092 + - KAFKA_BROKERS=kafka1:9092,kafka2:9092,kafka3:9092 depends_on: - kafka1 - kafka2 diff --git a/kafkaex_lag_exporter.iml b/kafkaex_lag_exporter.iml index 18bb574..7325038 100644 --- a/kafkaex_lag_exporter.iml +++ b/kafkaex_lag_exporter.iml @@ -17,7 +17,6 @@ - @@ -68,7 +67,6 @@ - @@ -78,9 +76,15 @@ + + + + + + + - @@ -129,5 +133,14 @@ + + + + + + + + + \ No newline at end of file diff --git a/lib/kafkaex_lag_exporter/application.ex b/lib/kafkaex_lag_exporter/application.ex index 89d767f..cf7a8a0 100644 --- a/lib/kafkaex_lag_exporter/application.ex +++ b/lib/kafkaex_lag_exporter/application.ex @@ -7,17 +7,6 @@ defmodule KafkaexLagExporter.Application do @impl true def start(_type, _args) do - consumer_group_opts = [ - # setting for the ConsumerGroup - heartbeat_interval: 1_000, - # this setting will be forwarded to the GenConsumer - commit_interval: 1_000 - ] - - gen_consumer_impl = KafkaexLagExporter.ConsumerOffsetsGenConsumer - consumer_group_name = "offsets_group" - topic_names = ["__consumer_offsets"] - children = [ KafkaexLagExporter.PromEx, # Start the Telemetry supervisor @@ -26,14 +15,7 @@ defmodule KafkaexLagExporter.Application do {Phoenix.PubSub, name: KafkaexLagExporter.PubSub}, # Start the Endpoint (http/https) KafkaexLagExporterWeb.Endpoint, - # Start a worker by calling: KafkaexLagExporter.Worker.start_link(arg) - # {KafkaexLagExporter.Worker, arg} - %{ - id: KafkaEx.ConsumerGroup, - start: - {KafkaEx.ConsumerGroup, :start_link, - [gen_consumer_impl, consumer_group_name, topic_names, consumer_group_opts]} - } + KafkaexLagExporter.ConsumerOffsetFetcher ] # See https://hexdocs.pm/elixir/Supervisor.html diff --git a/lib/kafkaex_lag_exporter/consumer_offset_fetcher.ex b/lib/kafkaex_lag_exporter/consumer_offset_fetcher.ex new file mode 100644 index 0000000..b17d577 --- /dev/null +++ b/lib/kafkaex_lag_exporter/consumer_offset_fetcher.ex @@ -0,0 +1,38 @@ +defmodule KafkaexLagExporter.ConsumerOffsetFetcher do + @moduledoc """ + Genserver implementation to consume new messages on topic '__consumer_offsets' + """ + + use GenServer + + require Logger + + @interval 5_000 + + def start_link(default) when is_list(default) do + GenServer.start_link(__MODULE__, default) + end + + @impl true + def init(_) do + Logger.info("Starting #{__MODULE__}") + + clients = Application.get_env(:brod, :clients) + endpoints = clients[:kafka_client][:endpoints] + + Logger.info("Reveived Kafka endpoints: #{inspect(endpoints)}") + + Process.send_after(self(), :tick, @interval) + {:ok, %{endpoints: endpoints}} + end + + @impl true + def handle_info(:tick, state) do + consumer_groups = :brod.list_all_groups(state.endpoints, []) + Logger.info("Consumer groups state: #{inspect(consumer_groups)}") + + Process.send_after(self(), :tick, @interval) + + {:noreply, state} + end +end diff --git a/lib/kafkaex_lag_exporter/consumer_offsets_consumer_group.ex b/lib/kafkaex_lag_exporter/consumer_offsets_consumer_group.ex deleted file mode 100644 index 14f8061..0000000 --- a/lib/kafkaex_lag_exporter/consumer_offsets_consumer_group.ex +++ /dev/null @@ -1,52 +0,0 @@ -defmodule KafkaexLagExporter.ConsumerOffsetsGenConsumer do - @moduledoc """ - Genserver implementation to consume new messages on topic '__consumer_offsets' - """ - - use KafkaEx.GenConsumer - - alias KafkaEx.Protocol.Fetch.Message - - require Logger - - def init(_topic, _partition, _extra_args) do - {:ok, %{}} - end - - def get() do - GenServer.cast(__MODULE__, {:get}) - end - - def handle_call({:get}, _from, state) do - {:reply, state} - end - - def handle_call({:push, topic, offset}, _from, state) do - new_state = Map.put(state, topic, offset) - - # IO.puts "new state" - # IO.inspect new_state - - {:reply, new_state} - end - - def handle_message_set(message_set, state) do - for %Message{key: key, offset: offset} <- message_set do - consumer_group = get_consumer_group(key) - - Logger.info("consumer_group '#{consumer_group}' has offset '#{offset}'}") - - # GenServer.call(__MODULE__, {:push, consumer_group, offset}) - end - - {:async_commit, state} - end - - defp get_consumer_group(<>) do - Logger.debug(fn -> "prefix: " <> inspect(prefix) end) - Logger.debug(fn -> "version: " <> inspect(version) end) - Logger.debug(fn -> "postfix: " <> inspect(postfix) end) - - consumer_group - end -end diff --git a/mix.exs b/mix.exs index 675171b..21662f7 100644 --- a/mix.exs +++ b/mix.exs @@ -39,7 +39,7 @@ defmodule KafkaexLagExporter.MixProject do {:plug_cowboy, "~> 2.5"}, {:credo, "~> 1.6", only: [:dev, :test], runtime: false}, {:dialyxir, "~> 1.0", only: [:dev], runtime: false}, - {:kafka_ex, "~> 0.12.1"}, + {:brod, "~> 3.16"}, {:prom_ex, "~> 1.6.0"} ] end diff --git a/mix.lock b/mix.lock index 2268cc9..9a61ac8 100644 --- a/mix.lock +++ b/mix.lock @@ -1,20 +1,19 @@ %{ + "brod": {:hex, :brod, "3.16.1", "1c7b03f99c7cc310de5511cadad9879ab0cc5f1a2612211e68c26dad517d31b0", [:rebar3], [{:kafka_protocol, "4.0.1", [hex: :kafka_protocol, repo: "hexpm", optional: false]}, {:snappyer, "1.2.8", [hex: :snappyer, repo: "hexpm", optional: false]}, {:supervisor3, "1.1.11", [hex: :supervisor3, repo: "hexpm", optional: false]}], "hexpm", "8297c47cd1ff0657955027fa1beb62edfaab1cc5e09b714cc29bd7f1c8d40083"}, "bunt": {:hex, :bunt, "0.2.0", "951c6e801e8b1d2cbe58ebbd3e616a869061ddadcc4863d0a2182541acae9a38", [:mix], [], "hexpm", "7af5c7e09fe1d40f76c8e4f9dd2be7cebd83909f31fee7cd0e9eadc567da8353"}, "castore": {:hex, :castore, "0.1.15", "dbb300827d5a3ec48f396ca0b77ad47058578927e9ebe792abd99fcbc3324326", [:mix], [], "hexpm", "c69379b907673c7e6eb229f09a0a09b60bb27cfb9625bcb82ea4c04ba82a8442"}, - "connection": {:hex, :connection, "1.1.0", "ff2a49c4b75b6fb3e674bfc5536451607270aac754ffd1bdfe175abe4a6d7a68", [:mix], [], "hexpm", "722c1eb0a418fbe91ba7bd59a47e28008a189d47e37e0e7bb85585a016b2869c"}, "cowboy": {:hex, :cowboy, "2.9.0", "865dd8b6607e14cf03282e10e934023a1bd8be6f6bacf921a7e2a96d800cd452", [:make, :rebar3], [{:cowlib, "2.11.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "2c729f934b4e1aa149aff882f57c6372c15399a20d54f65c8d67bef583021bde"}, "cowboy_telemetry": {:hex, :cowboy_telemetry, "0.4.0", "f239f68b588efa7707abce16a84d0d2acf3a0f50571f8bb7f56a15865aae820c", [:rebar3], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7d98bac1ee4565d31b62d59f8823dfd8356a169e7fcbb83831b8a5397404c9de"}, "cowlib": {:hex, :cowlib, "2.11.0", "0b9ff9c346629256c42ebe1eeb769a83c6cb771a6ee5960bd110ab0b9b872063", [:make, :rebar3], [], "hexpm", "2b3e9da0b21c4565751a6d4901c20d1b4cc25cbb7fd50d91d2ab6dd287bc86a9"}, - "crc32cer": {:hex, :crc32cer, "0.1.10", "fb87abbf34b72f180f8c3a908cd1826c6cb9a59787d156a29e05de9e98be385e", [:rebar3], [], "hexpm", "5b1f47efd0a1b4b7411f1f35e14d3c8c6da6e6a2a725ec8f2cf1ab13703e5f38"}, - "credo": {:hex, :credo, "1.6.3", "0a9f8925dbc8f940031b789f4623fc9a0eea99d3eed600fe831e403eb96c6a83", [:mix], [{:bunt, "~> 0.2.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2.8", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "1167cde00e6661d740fc54da2ee268e35d3982f027399b64d3e2e83af57a1180"}, + "crc32cer": {:hex, :crc32cer, "0.1.8", "c6c2275c5fb60a95f4935d414f30b50ee9cfed494081c9b36ebb02edfc2f48db", [:rebar3], [], "hexpm", "251499085482920deb6c9b7aadabf9fb4c432f96add97ab42aee4501e5b6f591"}, + "credo": {:hex, :credo, "1.6.4", "ddd474afb6e8c240313f3a7b0d025cc3213f0d171879429bf8535d7021d9ad78", [:mix], [{:bunt, "~> 0.2.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2.8", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "c28f910b61e1ff829bffa056ef7293a8db50e87f2c57a9b5c3f57eee124536b7"}, "dialyxir": {:hex, :dialyxir, "1.1.0", "c5aab0d6e71e5522e77beff7ba9e08f8e02bad90dfbeffae60eaf0cb47e29488", [:mix], [{:erlex, ">= 0.2.6", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "07ea8e49c45f15264ebe6d5b93799d4dd56a44036cf42d0ad9c960bc266c0b9a"}, "erlex": {:hex, :erlex, "0.2.6", "c7987d15e899c7a2f34f5420d2a2ea0d659682c06ac607572df55a43753aa12e", [:mix], [], "hexpm", "2ed2e25711feb44d52b17d2780eabf998452f6efda104877a3881c2f8c0c0c75"}, "file_system": {:hex, :file_system, "0.2.10", "fb082005a9cd1711c05b5248710f8826b02d7d1784e7c3451f9c1231d4fc162d", [:mix], [], "hexpm", "41195edbfb562a593726eda3b3e8b103a309b733ad25f3d642ba49696bf715dc"}, "finch": {:hex, :finch, "0.9.1", "ab2b0151ba88543e221cb50bf0734860db55e8748816ee16e4997fe205f7b315", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: false]}, {:mint, "~> 1.3", [hex: :mint, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.4.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 0.2", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "6d6b898a59d19f84958eaffec40580f5a9ff88a31e93156707fa8b1d552aa425"}, "hpax": {:hex, :hpax, "0.1.1", "2396c313683ada39e98c20a75a82911592b47e5c24391363343bde74f82396ca", [:mix], [], "hexpm", "0ae7d5a0b04a8a60caf7a39fcf3ec476f35cc2cc16c05abea730d3ce6ac6c826"}, "jason": {:hex, :jason, "1.3.0", "fa6b82a934feb176263ad2df0dbd91bf633d4a46ebfdffea0c8ae82953714946", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "53fc1f51255390e0ec7e50f9cb41e751c260d065dcba2bf0d08dc51a4002c2ac"}, - "kafka_ex": {:hex, :kafka_ex, "0.12.1", "83f93a0b04d392b7e0c35234f4c444990f03b616ce4e7121119b89772d28facc", [:mix], [{:kayrock, "~> 0.1.12", [hex: :kayrock, repo: "hexpm", optional: false]}], "hexpm", "a395791c0528a248b0dac5d40d1eef8dd0706530a83cfa6ad7007eab9576fee8"}, - "kayrock": {:hex, :kayrock, "0.1.14", "49aa3d6ff987c6ccf9c7cfe31d669161dfa16c5f83257b98f48a02246c461711", [:mix], [{:connection, "~>1.1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:crc32cer, "~>0.1.8", [hex: :crc32cer, repo: "hexpm", optional: false]}, {:varint, "~>1.2.0", [hex: :varint, repo: "hexpm", optional: false]}], "hexpm", "7ea2b3613a59fdff9f2e22ebd00bd7eac14290a41b6ec7d4385d9489d9bb6d89"}, + "kafka_protocol": {:hex, :kafka_protocol, "4.0.1", "fc696880c73483c8b032c4bb60f2873046035c7824e1edcb924cfce643cf23dd", [:rebar3], [{:crc32cer, "0.1.8", [hex: :crc32cer, repo: "hexpm", optional: false]}], "hexpm", "687bfd9989998ec8fbbc3ed50d1239a6c07a7dc15b52914ad477413b89ecb621"}, "mime": {:hex, :mime, "2.0.2", "0b9e1a4c840eafb68d820b0e2158ef5c49385d17fb36855ac6e7e087d4b1dcc5", [:mix], [], "hexpm", "e6a3f76b4c277739e36c2e21a2c640778ba4c3846189d5ab19f97f126df5f9b7"}, "mint": {:hex, :mint, "1.4.1", "49b3b6ea35a9a38836d2ad745251b01ca9ec062f7cb66f546bf22e6699137126", [:mix], [{:castore, "~> 0.1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "cd261766e61011a9079cccf8fa9d826e7a397c24fbedf0e11b49312bea629b58"}, "nimble_options": {:hex, :nimble_options, "0.4.0", "c89babbab52221a24b8d1ff9e7d838be70f0d871be823165c94dd3418eea728f", [:mix], [], "hexpm", "e6701c1af326a11eea9634a3b1c62b475339ace9456c1a23ec3bc9a847bca02d"}, @@ -27,9 +26,10 @@ "plug_crypto": {:hex, :plug_crypto, "1.2.2", "05654514ac717ff3a1843204b424477d9e60c143406aa94daf2274fdd280794d", [:mix], [], "hexpm", "87631c7ad914a5a445f0a3809f99b079113ae4ed4b867348dd9eec288cecb6db"}, "prom_ex": {:hex, :prom_ex, "1.6.0", "a243cf27e71a2f53abfa9428680bcb89983923bb65149309e945c5f1f1ea0c2d", [:mix], [{:absinthe, ">= 1.6.0", [hex: :absinthe, repo: "hexpm", optional: true]}, {:broadway, ">= 1.0.0", [hex: :broadway, repo: "hexpm", optional: true]}, {:ecto, ">= 3.5.0", [hex: :ecto, repo: "hexpm", optional: true]}, {:finch, "~> 0.9.0", [hex: :finch, repo: "hexpm", optional: false]}, {:jason, "~> 1.2", [hex: :jason, repo: "hexpm", optional: false]}, {:oban, ">= 2.4.0", [hex: :oban, repo: "hexpm", optional: true]}, {:phoenix, ">= 1.5.0", [hex: :phoenix, repo: "hexpm", optional: true]}, {:phoenix_live_view, ">= 0.14.0", [hex: :phoenix_live_view, repo: "hexpm", optional: true]}, {:plug, ">= 1.12.1", [hex: :plug, repo: "hexpm", optional: true]}, {:plug_cowboy, "~> 2.5.1", [hex: :plug_cowboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6.1", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}, {:telemetry_metrics_prometheus_core, "~> 1.0.2", [hex: :telemetry_metrics_prometheus_core, repo: "hexpm", optional: false]}, {:telemetry_poller, "~> 1.0.0", [hex: :telemetry_poller, repo: "hexpm", optional: false]}], "hexpm", "1c0242b8ade3f8343394645076c9d7c0a814f7876c2100fc719cb387922397db"}, "ranch": {:hex, :ranch, "1.8.0", "8c7a100a139fd57f17327b6413e4167ac559fbc04ca7448e9be9057311597a1d", [:make, :rebar3], [], "hexpm", "49fbcfd3682fab1f5d109351b61257676da1a2fdbe295904176d5e521a2ddfe5"}, + "snappyer": {:hex, :snappyer, "1.2.8", "201ce9067a33c71a6a5087c0c3a49a010b17112d461e6df696c722dcb6d0934a", [:rebar3], [], "hexpm", "35518e79a28548b56d8fd6aee2f565f12f51c2d3d053f9cfa817c83be88c4f3d"}, + "supervisor3": {:hex, :supervisor3, "1.1.11", "d81cdec31d102fde407423e1d05b569572850deebed86b951d5233c387cba80b", [:rebar3], [], "hexpm", "e6c2dedbcabcba24995a218aca12db5e208b80d3252692b22ef0f1a266104b50"}, "telemetry": {:hex, :telemetry, "1.0.0", "0f453a102cdf13d506b7c0ab158324c337c41f1cc7548f0bc0e130bbf0ae9452", [:rebar3], [], "hexpm", "73bc09fa59b4a0284efb4624335583c528e07ec9ae76aca96ea0673850aec57a"}, "telemetry_metrics": {:hex, :telemetry_metrics, "0.6.1", "315d9163a1d4660aedc3fee73f33f1d355dcc76c5c3ab3d59e76e3edf80eef1f", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7be9e0871c41732c233be71e4be11b96e56177bf15dde64a8ac9ce72ac9834c6"}, "telemetry_metrics_prometheus_core": {:hex, :telemetry_metrics_prometheus_core, "1.0.2", "c98b1c580de637bfeac00db41b9fb91fb4c3548ee3d512a8ed7299172312eaf3", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "48351a0d56f80e38c997b44232b1043e0a081670d16766eee920e6254175b730"}, "telemetry_poller": {:hex, :telemetry_poller, "1.0.0", "db91bb424e07f2bb6e73926fcafbfcbcb295f0193e0a00e825e589a0a47e8453", [:rebar3], [{:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "b3a24eafd66c3f42da30fc3ca7dda1e9d546c12250a2d60d7b81d264fbec4f6e"}, - "varint": {:hex, :varint, "1.2.0", "61bffd9dcc2d5242d59f75694506b4d4013bb103f6a23e34b94f89cebb0c1ab3", [:mix], [], "hexpm", "d94941ed8b9d1a5fdede9103a5e52035bd0aaf35081d44e67713a36799927e47"}, }