Replace kafka_ex with brod
This commit is contained in:
@@ -14,12 +14,10 @@
|
|||||||
#
|
#
|
||||||
ARG DOCKER_IMAGE="hexpm/elixir:1.13.3-erlang-23.2.3-alpine-3.15.0"
|
ARG DOCKER_IMAGE="hexpm/elixir:1.13.3-erlang-23.2.3-alpine-3.15.0"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
FROM ${DOCKER_IMAGE} as builder
|
FROM ${DOCKER_IMAGE} as builder
|
||||||
|
|
||||||
# install build dependencies
|
# install build dependencies
|
||||||
RUN apk add gcc git librdkafka-dev musl-dev
|
RUN apk add g++
|
||||||
|
|
||||||
# prepare build dir
|
# prepare build dir
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|||||||
@@ -23,76 +23,6 @@ config :logger, :console,
|
|||||||
# Use Jason for JSON parsing in Phoenix
|
# Use Jason for JSON parsing in Phoenix
|
||||||
config :phoenix, :json_library, Jason
|
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
|
# Import environment specific config. This must remain at the bottom
|
||||||
# of this file so it overrides the configuration defined above.
|
# of this file so it overrides the configuration defined above.
|
||||||
env_config = Path.expand("#{Mix.env()}.exs", __DIR__)
|
env_config = Path.expand("#{Mix.env()}.exs", __DIR__)
|
||||||
|
|||||||
@@ -38,13 +38,17 @@ if config_env() == :prod do
|
|||||||
# See `mix help release` for more information.
|
# See `mix help release` for more information.
|
||||||
end
|
end
|
||||||
|
|
||||||
{port, _} =
|
brokers =
|
||||||
System.fetch_env!("KAFKA_BROKER_PORT")
|
System.fetch_env!("KAFKA_BROKERS")
|
||||||
|> Integer.parse()
|
|> String.split(",")
|
||||||
|
|> Enum.map(fn x ->
|
||||||
|
[host, port] = String.split(x, ":")
|
||||||
|
{host, String.to_integer(port)}
|
||||||
|
end)
|
||||||
|
|
||||||
config :kafka_ex,
|
config :brod,
|
||||||
brokers: [
|
clients: [
|
||||||
{System.fetch_env!("KAFKA_BROKER1_HOST"), port},
|
kafka_client: [
|
||||||
{System.fetch_env!("KAFKA_BROKER2_HOST"), port},
|
endpoints: brokers
|
||||||
{System.fetch_env!("KAFKA_BROKER3_HOST"), port}
|
]
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -13,10 +13,4 @@ config :logger, level: :warn
|
|||||||
# Initialize plugs at runtime for faster test compilation
|
# Initialize plugs at runtime for faster test compilation
|
||||||
config :phoenix, :plug_init_mode, :runtime
|
config :phoenix, :plug_init_mode, :runtime
|
||||||
|
|
||||||
config :kafka_ex,
|
System.put_env("KAFKA_BROKERS", "test-host:9092")
|
||||||
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")
|
|
||||||
|
|||||||
@@ -95,10 +95,7 @@ services:
|
|||||||
ports:
|
ports:
|
||||||
- '4000:4000'
|
- '4000:4000'
|
||||||
environment:
|
environment:
|
||||||
- KAFKA_BROKER1_HOST=kafka1
|
- KAFKA_BROKERS=kafka1:9092,kafka2:9092,kafka3:9092
|
||||||
- KAFKA_BROKER2_HOST=kafka2
|
|
||||||
- KAFKA_BROKER3_HOST=kafka2
|
|
||||||
- KAFKA_BROKER_PORT=9092
|
|
||||||
depends_on:
|
depends_on:
|
||||||
- kafka1
|
- kafka1
|
||||||
- kafka2
|
- kafka2
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
<excludeFolder url="file://$MODULE_DIR$/_build/dev/lib/kayrock" />
|
<excludeFolder url="file://$MODULE_DIR$/_build/dev/lib/kayrock" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/_build/dev/lib/crc32cer" />
|
<excludeFolder url="file://$MODULE_DIR$/_build/dev/lib/crc32cer" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/_build/dev/lib/connection" />
|
<excludeFolder url="file://$MODULE_DIR$/_build/dev/lib/connection" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/_build/dev/lib/kafka_ex" />
|
|
||||||
<excludeFolder url="file://$MODULE_DIR$/_build/dev/lib/brod" />
|
<excludeFolder url="file://$MODULE_DIR$/_build/dev/lib/brod" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/_build/dev/lib/file_system" />
|
<excludeFolder url="file://$MODULE_DIR$/_build/dev/lib/file_system" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/_build/dev/lib/bunt" />
|
<excludeFolder url="file://$MODULE_DIR$/_build/dev/lib/bunt" />
|
||||||
@@ -68,7 +67,6 @@
|
|||||||
<excludeFolder url="file://$MODULE_DIR$/_build/test/lib/telemetry_metrics_prometheus_core" />
|
<excludeFolder url="file://$MODULE_DIR$/_build/test/lib/telemetry_metrics_prometheus_core" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/_build/test/lib/credo" />
|
<excludeFolder url="file://$MODULE_DIR$/_build/test/lib/credo" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/_build/test/lib/phoenix_pubsub" />
|
<excludeFolder url="file://$MODULE_DIR$/_build/test/lib/phoenix_pubsub" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/_build/test/lib/kafka_ex" />
|
|
||||||
<excludeFolder url="file://$MODULE_DIR$/_build/test/lib/cowlib" />
|
<excludeFolder url="file://$MODULE_DIR$/_build/test/lib/cowlib" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/_build/test/lib/mime" />
|
<excludeFolder url="file://$MODULE_DIR$/_build/test/lib/mime" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/_build/test/lib/plug_crypto" />
|
<excludeFolder url="file://$MODULE_DIR$/_build/test/lib/plug_crypto" />
|
||||||
@@ -78,9 +76,15 @@
|
|||||||
<excludeFolder url="file://$MODULE_DIR$/_build/test/lib/plug_cowboy" />
|
<excludeFolder url="file://$MODULE_DIR$/_build/test/lib/plug_cowboy" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/_build/test/lib/phoenix" />
|
<excludeFolder url="file://$MODULE_DIR$/_build/test/lib/phoenix" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/_build/test/lib/prom_ex" />
|
<excludeFolder url="file://$MODULE_DIR$/_build/test/lib/prom_ex" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/_build/dev/lib/supervisor3" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/_build/dev/lib/kafka_protocol" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/_build/dev/lib/snappyer" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/_build/test/lib/brod" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/_build/test/lib/snappyer" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/_build/test/lib/supervisor3" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/_build/test/lib/kafka_protocol" />
|
||||||
</content>
|
</content>
|
||||||
<orderEntry type="sourceFolder" forTests="false" />
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
<orderEntry type="library" name="kafka_ex" level="project" />
|
|
||||||
<orderEntry type="library" name="credo" level="project" />
|
<orderEntry type="library" name="credo" level="project" />
|
||||||
<orderEntry type="library" name="file_system" level="project" />
|
<orderEntry type="library" name="file_system" level="project" />
|
||||||
<orderEntry type="library" name="bunt" level="project" />
|
<orderEntry type="library" name="bunt" level="project" />
|
||||||
@@ -129,5 +133,14 @@
|
|||||||
<orderEntry type="library" name="phx_new" level="project" />
|
<orderEntry type="library" name="phx_new" level="project" />
|
||||||
<orderEntry type="library" name="websocket_client" level="project" />
|
<orderEntry type="library" name="websocket_client" level="project" />
|
||||||
<orderEntry type="library" name="esbuild" level="project" />
|
<orderEntry type="library" name="esbuild" level="project" />
|
||||||
|
<orderEntry type="library" name="phoenix" level="project" />
|
||||||
|
<orderEntry type="library" name="telemetry_metrics" level="project" />
|
||||||
|
<orderEntry type="library" name="telemetry_poller" level="project" />
|
||||||
|
<orderEntry type="library" name="jason" level="project" />
|
||||||
|
<orderEntry type="library" name="plug_cowboy" level="project" />
|
||||||
|
<orderEntry type="library" name="credo" level="project" />
|
||||||
|
<orderEntry type="library" name="dialyxir" level="project" />
|
||||||
|
<orderEntry type="library" name="prom_ex" level="project" />
|
||||||
|
<orderEntry type="library" name="brod" level="project" />
|
||||||
</component>
|
</component>
|
||||||
</module>
|
</module>
|
||||||
@@ -7,17 +7,6 @@ defmodule KafkaexLagExporter.Application do
|
|||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
def start(_type, _args) do
|
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 = [
|
children = [
|
||||||
KafkaexLagExporter.PromEx,
|
KafkaexLagExporter.PromEx,
|
||||||
# Start the Telemetry supervisor
|
# Start the Telemetry supervisor
|
||||||
@@ -26,14 +15,7 @@ defmodule KafkaexLagExporter.Application do
|
|||||||
{Phoenix.PubSub, name: KafkaexLagExporter.PubSub},
|
{Phoenix.PubSub, name: KafkaexLagExporter.PubSub},
|
||||||
# Start the Endpoint (http/https)
|
# Start the Endpoint (http/https)
|
||||||
KafkaexLagExporterWeb.Endpoint,
|
KafkaexLagExporterWeb.Endpoint,
|
||||||
# Start a worker by calling: KafkaexLagExporter.Worker.start_link(arg)
|
KafkaexLagExporter.ConsumerOffsetFetcher
|
||||||
# {KafkaexLagExporter.Worker, arg}
|
|
||||||
%{
|
|
||||||
id: KafkaEx.ConsumerGroup,
|
|
||||||
start:
|
|
||||||
{KafkaEx.ConsumerGroup, :start_link,
|
|
||||||
[gen_consumer_impl, consumer_group_name, topic_names, consumer_group_opts]}
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
|
|
||||||
# See https://hexdocs.pm/elixir/Supervisor.html
|
# See https://hexdocs.pm/elixir/Supervisor.html
|
||||||
|
|||||||
38
lib/kafkaex_lag_exporter/consumer_offset_fetcher.ex
Normal file
38
lib/kafkaex_lag_exporter/consumer_offset_fetcher.ex
Normal file
@@ -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
|
||||||
@@ -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(<<prefix, version, postfix::binary-size(2), consumer_group::binary>>) 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
|
|
||||||
2
mix.exs
2
mix.exs
@@ -39,7 +39,7 @@ defmodule KafkaexLagExporter.MixProject do
|
|||||||
{:plug_cowboy, "~> 2.5"},
|
{:plug_cowboy, "~> 2.5"},
|
||||||
{:credo, "~> 1.6", only: [:dev, :test], runtime: false},
|
{:credo, "~> 1.6", only: [:dev, :test], runtime: false},
|
||||||
{:dialyxir, "~> 1.0", only: [:dev], runtime: false},
|
{:dialyxir, "~> 1.0", only: [:dev], runtime: false},
|
||||||
{:kafka_ex, "~> 0.12.1"},
|
{:brod, "~> 3.16"},
|
||||||
{:prom_ex, "~> 1.6.0"}
|
{:prom_ex, "~> 1.6.0"}
|
||||||
]
|
]
|
||||||
end
|
end
|
||||||
|
|||||||
12
mix.lock
12
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"},
|
"bunt": {:hex, :bunt, "0.2.0", "951c6e801e8b1d2cbe58ebbd3e616a869061ddadcc4863d0a2182541acae9a38", [:mix], [], "hexpm", "7af5c7e09fe1d40f76c8e4f9dd2be7cebd83909f31fee7cd0e9eadc567da8353"},
|
||||||
"castore": {:hex, :castore, "0.1.15", "dbb300827d5a3ec48f396ca0b77ad47058578927e9ebe792abd99fcbc3324326", [:mix], [], "hexpm", "c69379b907673c7e6eb229f09a0a09b60bb27cfb9625bcb82ea4c04ba82a8442"},
|
"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": {: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"},
|
"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"},
|
"cowlib": {:hex, :cowlib, "2.11.0", "0b9ff9c346629256c42ebe1eeb769a83c6cb771a6ee5960bd110ab0b9b872063", [:make, :rebar3], [], "hexpm", "2b3e9da0b21c4565751a6d4901c20d1b4cc25cbb7fd50d91d2ab6dd287bc86a9"},
|
||||||
"crc32cer": {:hex, :crc32cer, "0.1.10", "fb87abbf34b72f180f8c3a908cd1826c6cb9a59787d156a29e05de9e98be385e", [:rebar3], [], "hexpm", "5b1f47efd0a1b4b7411f1f35e14d3c8c6da6e6a2a725ec8f2cf1ab13703e5f38"},
|
"crc32cer": {:hex, :crc32cer, "0.1.8", "c6c2275c5fb60a95f4935d414f30b50ee9cfed494081c9b36ebb02edfc2f48db", [:rebar3], [], "hexpm", "251499085482920deb6c9b7aadabf9fb4c432f96add97ab42aee4501e5b6f591"},
|
||||||
"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"},
|
"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"},
|
"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"},
|
"erlex": {:hex, :erlex, "0.2.6", "c7987d15e899c7a2f34f5420d2a2ea0d659682c06ac607572df55a43753aa12e", [:mix], [], "hexpm", "2ed2e25711feb44d52b17d2780eabf998452f6efda104877a3881c2f8c0c0c75"},
|
||||||
"file_system": {:hex, :file_system, "0.2.10", "fb082005a9cd1711c05b5248710f8826b02d7d1784e7c3451f9c1231d4fc162d", [:mix], [], "hexpm", "41195edbfb562a593726eda3b3e8b103a309b733ad25f3d642ba49696bf715dc"},
|
"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"},
|
"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"},
|
"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"},
|
"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"},
|
"kafka_protocol": {:hex, :kafka_protocol, "4.0.1", "fc696880c73483c8b032c4bb60f2873046035c7824e1edcb924cfce643cf23dd", [:rebar3], [{:crc32cer, "0.1.8", [hex: :crc32cer, repo: "hexpm", optional: false]}], "hexpm", "687bfd9989998ec8fbbc3ed50d1239a6c07a7dc15b52914ad477413b89ecb621"},
|
||||||
"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"},
|
|
||||||
"mime": {:hex, :mime, "2.0.2", "0b9e1a4c840eafb68d820b0e2158ef5c49385d17fb36855ac6e7e087d4b1dcc5", [:mix], [], "hexpm", "e6a3f76b4c277739e36c2e21a2c640778ba4c3846189d5ab19f97f126df5f9b7"},
|
"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"},
|
"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"},
|
"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"},
|
"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"},
|
"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"},
|
"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": {: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": {: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_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"},
|
"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"},
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user