@@ -14,6 +14,8 @@ defmodule KafkaEx.New.Client do
1414 alias KafkaEx.Config
1515 alias KafkaEx.NetworkClient
1616
17+ alias KafkaEx.New.Client.RequestBuilder
18+ alias KafkaEx.New.Client.ResponseParser
1719 alias KafkaEx.New.Structs.Broker
1820 alias KafkaEx.New.Structs.ClusterMetadata
1921 alias KafkaEx.New.Structs.NodeSelector
@@ -163,6 +165,17 @@ defmodule KafkaEx.New.Client do
163165 { :reply , { :ok , topic_metadata } , updated_state }
164166 end
165167
168+ def handle_call ( { :describe_groups , [ consumer_group_name ] } , _from , state ) do
169+ if KafkaEx . valid_consumer_group? ( consumer_group_name ) do
170+ { response , updated_state } =
171+ describe_group_request ( consumer_group_name , state )
172+
173+ { :reply , response , updated_state }
174+ else
175+ { :reply , { :error , :invalid_consumer_group } , state }
176+ end
177+ end
178+
166179 def handle_call ( { :kayrock_request , request , node_selector } , _from , state ) do
167180 { response , updated_state } = kayrock_network_request ( request , node_selector , state )
168181
@@ -245,6 +258,72 @@ defmodule KafkaEx.New.Client do
245258 end
246259 end
247260
261+ defp describe_group_request ( consumer_group_name , state ) do
262+ node_selector = NodeSelector . consumer_group ( consumer_group_name )
263+
264+ [ consumer_group_name ]
265+ |> RequestBuilder . describe_groups_request ( state )
266+ |> handle_describe_group_request ( node_selector , state )
267+ end
268+
269+ defp handle_describe_group_request (
270+ _ ,
271+ _ ,
272+ _ ,
273+ retry_count \\ @ retry_count ,
274+ _last_error \\ nil
275+ )
276+
277+ defp handle_describe_group_request ( _ , _ , state , 0 , last_error ) do
278+ { { :error , last_error } , state }
279+ end
280+
281+ defp handle_describe_group_request (
282+ request ,
283+ node_selector ,
284+ state ,
285+ retry_count ,
286+ _last_error
287+ ) do
288+ case kayrock_network_request ( request , node_selector , state ) do
289+ { { :ok , response } , state_out } ->
290+ case ResponseParser . describe_groups_response ( response ) do
291+ { :ok , [ consumer_group ] } ->
292+ { { :ok , consumer_group } , state_out }
293+
294+ { :error , [ error | _ ] } ->
295+ consumer_group = request . groups [ 0 ]
296+
297+ Logger . warn (
298+ "Unable to fetch consumer group metadata for #{ consumer_group . group_id } "
299+ )
300+
301+ handle_describe_group_request (
302+ request ,
303+ node_selector ,
304+ state ,
305+ retry_count - 1 ,
306+ error
307+ )
308+ end
309+
310+ { _ , _state_out } ->
311+ consumer_group = request . groups [ 0 ]
312+
313+ Logger . warn (
314+ "Unable to fetch consumer group metadata for #{ consumer_group . group_id } "
315+ )
316+
317+ handle_describe_group_request (
318+ request ,
319+ node_selector ,
320+ state ,
321+ retry_count - 1 ,
322+ :unknown
323+ )
324+ end
325+ end
326+
248327 defp maybe_connect_broker ( broker , state ) do
249328 case Broker . connected? ( broker ) do
250329 true ->
0 commit comments