@ohos-ports/514labs-kafka-javascript 0.0.0-stage → 1.7.1-patch-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (639) hide show
  1. package/.claude/settings.local.json +12 -0
  2. package/.editorconfig +5 -0
  3. package/.envrc +1 -0
  4. package/CHANGELOG.md +380 -0
  5. package/CONTRIBUTING.md +257 -0
  6. package/INTRODUCTION.md +1155 -0
  7. package/LICENSE.kafkajs +31 -0
  8. package/LICENSE.node-rdkafka +25 -0
  9. package/LICENSE.txt +20 -0
  10. package/MIGRATION.md +428 -0
  11. package/Makefile +84 -0
  12. package/QUICKSTART.md +70 -0
  13. package/README.md +127 -2
  14. package/SECURITY.md +11 -0
  15. package/binding.gyp +167 -0
  16. package/buf.gen.yaml +8 -0
  17. package/build/Release/confluent-kafka-javascript.node +0 -0
  18. package/configure +15 -0
  19. package/coverage/mocha/base.css +224 -0
  20. package/coverage/mocha/block-navigation.js +87 -0
  21. package/coverage/mocha/coverage-final.json +11 -0
  22. package/coverage/mocha/favicon.png +0 -0
  23. package/coverage/mocha/forked-kafkajs/index.html +116 -0
  24. package/coverage/mocha/forked-kafkajs/lib/client.js.html +2122 -0
  25. package/coverage/mocha/forked-kafkajs/lib/error.js.html +1588 -0
  26. package/coverage/mocha/forked-kafkajs/lib/index.html +236 -0
  27. package/coverage/mocha/forked-kafkajs/lib/kafka-consumer-stream.js.html +1282 -0
  28. package/coverage/mocha/forked-kafkajs/lib/kafka-consumer.js.html +2476 -0
  29. package/coverage/mocha/forked-kafkajs/lib/producer-stream.js.html +1096 -0
  30. package/coverage/mocha/forked-kafkajs/lib/producer.js.html +1300 -0
  31. package/coverage/mocha/forked-kafkajs/lib/topic-partition.js.html +358 -0
  32. package/coverage/mocha/forked-kafkajs/lib/topic.js.html +214 -0
  33. package/coverage/mocha/forked-kafkajs/lib/util.js.html +250 -0
  34. package/coverage/mocha/forked-kafkajs/librdkafka.js.html +121 -0
  35. package/coverage/mocha/index.html +131 -0
  36. package/coverage/mocha/prettify.css +1 -0
  37. package/coverage/mocha/prettify.js +2 -0
  38. package/coverage/mocha/sort-arrow-sprite.png +0 -0
  39. package/coverage/mocha/sorter.js +210 -0
  40. package/cpplint.py +6970 -0
  41. package/deploy.enc +0 -0
  42. package/deps/librdkafka/.clang-format +136 -0
  43. package/deps/librdkafka/.clang-format-cpp +103 -0
  44. package/deps/librdkafka/.dir-locals.el +10 -0
  45. package/deps/librdkafka/.formatignore +33 -0
  46. package/deps/librdkafka/.gdbmacros +19 -0
  47. package/deps/librdkafka/CHANGELOG.md +2225 -0
  48. package/deps/librdkafka/CMakeLists.txt +291 -0
  49. package/deps/librdkafka/CODE_OF_CONDUCT.md +46 -0
  50. package/deps/librdkafka/CONFIGURATION.md +209 -0
  51. package/deps/librdkafka/CONTRIBUTING.md +431 -0
  52. package/deps/librdkafka/Doxyfile +2375 -0
  53. package/deps/librdkafka/INTRODUCTION.md +2481 -0
  54. package/deps/librdkafka/LICENSE +26 -0
  55. package/deps/librdkafka/LICENSE.cjson +22 -0
  56. package/deps/librdkafka/LICENSE.crc32c +28 -0
  57. package/deps/librdkafka/LICENSE.fnv1a +18 -0
  58. package/deps/librdkafka/LICENSE.hdrhistogram +27 -0
  59. package/deps/librdkafka/LICENSE.lz4 +26 -0
  60. package/deps/librdkafka/LICENSE.murmur2 +25 -0
  61. package/deps/librdkafka/LICENSE.nanopb +22 -0
  62. package/deps/librdkafka/LICENSE.opentelemetry +203 -0
  63. package/deps/librdkafka/LICENSE.pycrc +23 -0
  64. package/deps/librdkafka/LICENSE.queue +31 -0
  65. package/deps/librdkafka/LICENSE.regexp +5 -0
  66. package/deps/librdkafka/LICENSE.snappy +36 -0
  67. package/deps/librdkafka/LICENSE.tinycthread +26 -0
  68. package/deps/librdkafka/LICENSE.wingetopt +49 -0
  69. package/deps/librdkafka/LICENSES.txt +625 -0
  70. package/deps/librdkafka/Makefile +125 -0
  71. package/deps/librdkafka/README.md +199 -0
  72. package/deps/librdkafka/README.win32 +26 -0
  73. package/deps/librdkafka/STATISTICS.md +624 -0
  74. package/deps/librdkafka/configure +214 -0
  75. package/deps/librdkafka/configure.self +331 -0
  76. package/deps/librdkafka/dev-conf.sh +123 -0
  77. package/deps/librdkafka/lds-gen.py +73 -0
  78. package/deps/librdkafka/mainpage.doxy +40 -0
  79. package/deps/librdkafka/mklove/Makefile.base +329 -0
  80. package/deps/librdkafka/mklove/modules/configure.atomics +144 -0
  81. package/deps/librdkafka/mklove/modules/configure.base +2484 -0
  82. package/deps/librdkafka/mklove/modules/configure.builtin +70 -0
  83. package/deps/librdkafka/mklove/modules/configure.cc +186 -0
  84. package/deps/librdkafka/mklove/modules/configure.cxx +8 -0
  85. package/deps/librdkafka/mklove/modules/configure.fileversion +65 -0
  86. package/deps/librdkafka/mklove/modules/configure.gitversion +29 -0
  87. package/deps/librdkafka/mklove/modules/configure.good_cflags +18 -0
  88. package/deps/librdkafka/mklove/modules/configure.host +132 -0
  89. package/deps/librdkafka/mklove/modules/configure.lib +49 -0
  90. package/deps/librdkafka/mklove/modules/configure.libcurl +99 -0
  91. package/deps/librdkafka/mklove/modules/configure.libsasl2 +36 -0
  92. package/deps/librdkafka/mklove/modules/configure.libssl +147 -0
  93. package/deps/librdkafka/mklove/modules/configure.libzstd +58 -0
  94. package/deps/librdkafka/mklove/modules/configure.parseversion +95 -0
  95. package/deps/librdkafka/mklove/modules/configure.pic +16 -0
  96. package/deps/librdkafka/mklove/modules/configure.socket +20 -0
  97. package/deps/librdkafka/mklove/modules/configure.zlib +61 -0
  98. package/deps/librdkafka/mklove/modules/patches/README.md +8 -0
  99. package/deps/librdkafka/mklove/modules/patches/libcurl.0000-no-runtime-linking-check.patch +11 -0
  100. package/deps/librdkafka/mklove/modules/patches/libssl.0000-osx-rand-include-fix-OpenSSL-PR16409.patch +56 -0
  101. package/deps/librdkafka/service.yml +172 -0
  102. package/deps/librdkafka/src/CMakeLists.txt +374 -0
  103. package/deps/librdkafka/src/Makefile +103 -0
  104. package/deps/librdkafka/src/README.lz4.md +30 -0
  105. package/deps/librdkafka/src/cJSON.c +2834 -0
  106. package/deps/librdkafka/src/cJSON.h +398 -0
  107. package/deps/librdkafka/src/crc32c.c +430 -0
  108. package/deps/librdkafka/src/crc32c.h +38 -0
  109. package/deps/librdkafka/src/generate_proto.sh +66 -0
  110. package/deps/librdkafka/src/librdkafka_cgrp_synch.png +0 -0
  111. package/deps/librdkafka/src/lz4.c +2727 -0
  112. package/deps/librdkafka/src/lz4.h +842 -0
  113. package/deps/librdkafka/src/lz4frame.c +2078 -0
  114. package/deps/librdkafka/src/lz4frame.h +692 -0
  115. package/deps/librdkafka/src/lz4frame_static.h +47 -0
  116. package/deps/librdkafka/src/lz4hc.c +1631 -0
  117. package/deps/librdkafka/src/lz4hc.h +413 -0
  118. package/deps/librdkafka/src/nanopb/pb.h +917 -0
  119. package/deps/librdkafka/src/nanopb/pb_common.c +388 -0
  120. package/deps/librdkafka/src/nanopb/pb_common.h +49 -0
  121. package/deps/librdkafka/src/nanopb/pb_decode.c +1727 -0
  122. package/deps/librdkafka/src/nanopb/pb_decode.h +193 -0
  123. package/deps/librdkafka/src/nanopb/pb_encode.c +1000 -0
  124. package/deps/librdkafka/src/nanopb/pb_encode.h +185 -0
  125. package/deps/librdkafka/src/opentelemetry/common.pb.c +32 -0
  126. package/deps/librdkafka/src/opentelemetry/common.pb.h +170 -0
  127. package/deps/librdkafka/src/opentelemetry/metrics.options +2 -0
  128. package/deps/librdkafka/src/opentelemetry/metrics.pb.c +67 -0
  129. package/deps/librdkafka/src/opentelemetry/metrics.pb.h +966 -0
  130. package/deps/librdkafka/src/opentelemetry/resource.pb.c +12 -0
  131. package/deps/librdkafka/src/opentelemetry/resource.pb.h +58 -0
  132. package/deps/librdkafka/src/queue.h +850 -0
  133. package/deps/librdkafka/src/rd.h +584 -0
  134. package/deps/librdkafka/src/rdaddr.c +255 -0
  135. package/deps/librdkafka/src/rdaddr.h +202 -0
  136. package/deps/librdkafka/src/rdatomic.h +230 -0
  137. package/deps/librdkafka/src/rdavg.h +260 -0
  138. package/deps/librdkafka/src/rdavl.c +210 -0
  139. package/deps/librdkafka/src/rdavl.h +250 -0
  140. package/deps/librdkafka/src/rdbase64.c +200 -0
  141. package/deps/librdkafka/src/rdbase64.h +43 -0
  142. package/deps/librdkafka/src/rdbuf.c +1884 -0
  143. package/deps/librdkafka/src/rdbuf.h +375 -0
  144. package/deps/librdkafka/src/rdcrc32.c +114 -0
  145. package/deps/librdkafka/src/rdcrc32.h +170 -0
  146. package/deps/librdkafka/src/rddl.c +179 -0
  147. package/deps/librdkafka/src/rddl.h +43 -0
  148. package/deps/librdkafka/src/rdendian.h +175 -0
  149. package/deps/librdkafka/src/rdfloat.h +67 -0
  150. package/deps/librdkafka/src/rdfnv1a.c +113 -0
  151. package/deps/librdkafka/src/rdfnv1a.h +35 -0
  152. package/deps/librdkafka/src/rdgz.c +120 -0
  153. package/deps/librdkafka/src/rdgz.h +46 -0
  154. package/deps/librdkafka/src/rdhdrhistogram.c +721 -0
  155. package/deps/librdkafka/src/rdhdrhistogram.h +87 -0
  156. package/deps/librdkafka/src/rdhttp.c +830 -0
  157. package/deps/librdkafka/src/rdhttp.h +101 -0
  158. package/deps/librdkafka/src/rdinterval.h +177 -0
  159. package/deps/librdkafka/src/rdkafka.c +5505 -0
  160. package/deps/librdkafka/src/rdkafka.h +10686 -0
  161. package/deps/librdkafka/src/rdkafka_admin.c +9794 -0
  162. package/deps/librdkafka/src/rdkafka_admin.h +661 -0
  163. package/deps/librdkafka/src/rdkafka_assignment.c +1010 -0
  164. package/deps/librdkafka/src/rdkafka_assignment.h +73 -0
  165. package/deps/librdkafka/src/rdkafka_assignor.c +1786 -0
  166. package/deps/librdkafka/src/rdkafka_assignor.h +402 -0
  167. package/deps/librdkafka/src/rdkafka_aux.c +409 -0
  168. package/deps/librdkafka/src/rdkafka_aux.h +174 -0
  169. package/deps/librdkafka/src/rdkafka_background.c +221 -0
  170. package/deps/librdkafka/src/rdkafka_broker.c +6337 -0
  171. package/deps/librdkafka/src/rdkafka_broker.h +744 -0
  172. package/deps/librdkafka/src/rdkafka_buf.c +543 -0
  173. package/deps/librdkafka/src/rdkafka_buf.h +1525 -0
  174. package/deps/librdkafka/src/rdkafka_cert.c +576 -0
  175. package/deps/librdkafka/src/rdkafka_cert.h +62 -0
  176. package/deps/librdkafka/src/rdkafka_cgrp.c +7587 -0
  177. package/deps/librdkafka/src/rdkafka_cgrp.h +477 -0
  178. package/deps/librdkafka/src/rdkafka_conf.c +4880 -0
  179. package/deps/librdkafka/src/rdkafka_conf.h +732 -0
  180. package/deps/librdkafka/src/rdkafka_confval.h +97 -0
  181. package/deps/librdkafka/src/rdkafka_coord.c +623 -0
  182. package/deps/librdkafka/src/rdkafka_coord.h +132 -0
  183. package/deps/librdkafka/src/rdkafka_error.c +228 -0
  184. package/deps/librdkafka/src/rdkafka_error.h +80 -0
  185. package/deps/librdkafka/src/rdkafka_event.c +502 -0
  186. package/deps/librdkafka/src/rdkafka_event.h +126 -0
  187. package/deps/librdkafka/src/rdkafka_feature.c +898 -0
  188. package/deps/librdkafka/src/rdkafka_feature.h +104 -0
  189. package/deps/librdkafka/src/rdkafka_fetcher.c +1422 -0
  190. package/deps/librdkafka/src/rdkafka_fetcher.h +44 -0
  191. package/deps/librdkafka/src/rdkafka_header.c +220 -0
  192. package/deps/librdkafka/src/rdkafka_header.h +76 -0
  193. package/deps/librdkafka/src/rdkafka_idempotence.c +807 -0
  194. package/deps/librdkafka/src/rdkafka_idempotence.h +144 -0
  195. package/deps/librdkafka/src/rdkafka_int.h +1260 -0
  196. package/deps/librdkafka/src/rdkafka_interceptor.c +819 -0
  197. package/deps/librdkafka/src/rdkafka_interceptor.h +104 -0
  198. package/deps/librdkafka/src/rdkafka_lz4.c +450 -0
  199. package/deps/librdkafka/src/rdkafka_lz4.h +49 -0
  200. package/deps/librdkafka/src/rdkafka_metadata.c +2209 -0
  201. package/deps/librdkafka/src/rdkafka_metadata.h +345 -0
  202. package/deps/librdkafka/src/rdkafka_metadata_cache.c +1183 -0
  203. package/deps/librdkafka/src/rdkafka_mock.c +3661 -0
  204. package/deps/librdkafka/src/rdkafka_mock.h +610 -0
  205. package/deps/librdkafka/src/rdkafka_mock_cgrp.c +1876 -0
  206. package/deps/librdkafka/src/rdkafka_mock_handlers.c +3113 -0
  207. package/deps/librdkafka/src/rdkafka_mock_int.h +710 -0
  208. package/deps/librdkafka/src/rdkafka_msg.c +2589 -0
  209. package/deps/librdkafka/src/rdkafka_msg.h +614 -0
  210. package/deps/librdkafka/src/rdkafka_msgbatch.h +62 -0
  211. package/deps/librdkafka/src/rdkafka_msgset.h +98 -0
  212. package/deps/librdkafka/src/rdkafka_msgset_reader.c +1806 -0
  213. package/deps/librdkafka/src/rdkafka_msgset_writer.c +1474 -0
  214. package/deps/librdkafka/src/rdkafka_offset.c +1565 -0
  215. package/deps/librdkafka/src/rdkafka_offset.h +150 -0
  216. package/deps/librdkafka/src/rdkafka_op.c +997 -0
  217. package/deps/librdkafka/src/rdkafka_op.h +858 -0
  218. package/deps/librdkafka/src/rdkafka_partition.c +4896 -0
  219. package/deps/librdkafka/src/rdkafka_partition.h +1182 -0
  220. package/deps/librdkafka/src/rdkafka_pattern.c +228 -0
  221. package/deps/librdkafka/src/rdkafka_pattern.h +70 -0
  222. package/deps/librdkafka/src/rdkafka_plugin.c +213 -0
  223. package/deps/librdkafka/src/rdkafka_plugin.h +41 -0
  224. package/deps/librdkafka/src/rdkafka_proto.h +736 -0
  225. package/deps/librdkafka/src/rdkafka_protocol.h +128 -0
  226. package/deps/librdkafka/src/rdkafka_queue.c +1230 -0
  227. package/deps/librdkafka/src/rdkafka_queue.h +1220 -0
  228. package/deps/librdkafka/src/rdkafka_range_assignor.c +1748 -0
  229. package/deps/librdkafka/src/rdkafka_request.c +7089 -0
  230. package/deps/librdkafka/src/rdkafka_request.h +732 -0
  231. package/deps/librdkafka/src/rdkafka_roundrobin_assignor.c +123 -0
  232. package/deps/librdkafka/src/rdkafka_sasl.c +530 -0
  233. package/deps/librdkafka/src/rdkafka_sasl.h +63 -0
  234. package/deps/librdkafka/src/rdkafka_sasl_cyrus.c +722 -0
  235. package/deps/librdkafka/src/rdkafka_sasl_int.h +89 -0
  236. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer.c +1833 -0
  237. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer.h +52 -0
  238. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer_oidc.c +1666 -0
  239. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer_oidc.h +47 -0
  240. package/deps/librdkafka/src/rdkafka_sasl_plain.c +142 -0
  241. package/deps/librdkafka/src/rdkafka_sasl_scram.c +858 -0
  242. package/deps/librdkafka/src/rdkafka_sasl_win32.c +550 -0
  243. package/deps/librdkafka/src/rdkafka_ssl.c +2129 -0
  244. package/deps/librdkafka/src/rdkafka_ssl.h +86 -0
  245. package/deps/librdkafka/src/rdkafka_sticky_assignor.c +4785 -0
  246. package/deps/librdkafka/src/rdkafka_subscription.c +278 -0
  247. package/deps/librdkafka/src/rdkafka_telemetry.c +760 -0
  248. package/deps/librdkafka/src/rdkafka_telemetry.h +52 -0
  249. package/deps/librdkafka/src/rdkafka_telemetry_decode.c +1053 -0
  250. package/deps/librdkafka/src/rdkafka_telemetry_decode.h +59 -0
  251. package/deps/librdkafka/src/rdkafka_telemetry_encode.c +997 -0
  252. package/deps/librdkafka/src/rdkafka_telemetry_encode.h +301 -0
  253. package/deps/librdkafka/src/rdkafka_timer.c +402 -0
  254. package/deps/librdkafka/src/rdkafka_timer.h +117 -0
  255. package/deps/librdkafka/src/rdkafka_topic.c +2161 -0
  256. package/deps/librdkafka/src/rdkafka_topic.h +334 -0
  257. package/deps/librdkafka/src/rdkafka_transport.c +1309 -0
  258. package/deps/librdkafka/src/rdkafka_transport.h +99 -0
  259. package/deps/librdkafka/src/rdkafka_transport_int.h +100 -0
  260. package/deps/librdkafka/src/rdkafka_txnmgr.c +3256 -0
  261. package/deps/librdkafka/src/rdkafka_txnmgr.h +171 -0
  262. package/deps/librdkafka/src/rdkafka_zstd.c +226 -0
  263. package/deps/librdkafka/src/rdkafka_zstd.h +57 -0
  264. package/deps/librdkafka/src/rdlist.c +576 -0
  265. package/deps/librdkafka/src/rdlist.h +434 -0
  266. package/deps/librdkafka/src/rdlog.c +89 -0
  267. package/deps/librdkafka/src/rdlog.h +41 -0
  268. package/deps/librdkafka/src/rdmap.c +508 -0
  269. package/deps/librdkafka/src/rdmap.h +492 -0
  270. package/deps/librdkafka/src/rdmurmur2.c +167 -0
  271. package/deps/librdkafka/src/rdmurmur2.h +35 -0
  272. package/deps/librdkafka/src/rdports.c +61 -0
  273. package/deps/librdkafka/src/rdports.h +38 -0
  274. package/deps/librdkafka/src/rdposix.h +250 -0
  275. package/deps/librdkafka/src/rdrand.c +80 -0
  276. package/deps/librdkafka/src/rdrand.h +43 -0
  277. package/deps/librdkafka/src/rdregex.c +156 -0
  278. package/deps/librdkafka/src/rdregex.h +43 -0
  279. package/deps/librdkafka/src/rdsignal.h +57 -0
  280. package/deps/librdkafka/src/rdstring.c +645 -0
  281. package/deps/librdkafka/src/rdstring.h +98 -0
  282. package/deps/librdkafka/src/rdsysqueue.h +404 -0
  283. package/deps/librdkafka/src/rdtime.h +356 -0
  284. package/deps/librdkafka/src/rdtypes.h +86 -0
  285. package/deps/librdkafka/src/rdunittest.c +549 -0
  286. package/deps/librdkafka/src/rdunittest.h +232 -0
  287. package/deps/librdkafka/src/rdvarint.c +134 -0
  288. package/deps/librdkafka/src/rdvarint.h +165 -0
  289. package/deps/librdkafka/src/rdwin32.h +382 -0
  290. package/deps/librdkafka/src/rdxxhash.c +1030 -0
  291. package/deps/librdkafka/src/rdxxhash.h +328 -0
  292. package/deps/librdkafka/src/regexp.c +1352 -0
  293. package/deps/librdkafka/src/regexp.h +41 -0
  294. package/deps/librdkafka/src/snappy.c +1866 -0
  295. package/deps/librdkafka/src/snappy.h +62 -0
  296. package/deps/librdkafka/src/snappy_compat.h +138 -0
  297. package/deps/librdkafka/src/statistics_schema.json +444 -0
  298. package/deps/librdkafka/src/tinycthread.c +932 -0
  299. package/deps/librdkafka/src/tinycthread.h +503 -0
  300. package/deps/librdkafka/src/tinycthread_extra.c +199 -0
  301. package/deps/librdkafka/src/tinycthread_extra.h +212 -0
  302. package/deps/librdkafka/src/win32_config.h +58 -0
  303. package/deps/librdkafka/src-cpp/CMakeLists.txt +90 -0
  304. package/deps/librdkafka/src-cpp/ConfImpl.cpp +84 -0
  305. package/deps/librdkafka/src-cpp/ConsumerImpl.cpp +244 -0
  306. package/deps/librdkafka/src-cpp/HandleImpl.cpp +436 -0
  307. package/deps/librdkafka/src-cpp/HeadersImpl.cpp +48 -0
  308. package/deps/librdkafka/src-cpp/KafkaConsumerImpl.cpp +296 -0
  309. package/deps/librdkafka/src-cpp/Makefile +55 -0
  310. package/deps/librdkafka/src-cpp/MessageImpl.cpp +38 -0
  311. package/deps/librdkafka/src-cpp/MetadataImpl.cpp +170 -0
  312. package/deps/librdkafka/src-cpp/ProducerImpl.cpp +197 -0
  313. package/deps/librdkafka/src-cpp/QueueImpl.cpp +70 -0
  314. package/deps/librdkafka/src-cpp/README.md +16 -0
  315. package/deps/librdkafka/src-cpp/RdKafka.cpp +59 -0
  316. package/deps/librdkafka/src-cpp/TopicImpl.cpp +124 -0
  317. package/deps/librdkafka/src-cpp/TopicPartitionImpl.cpp +57 -0
  318. package/deps/librdkafka/src-cpp/rdkafkacpp.h +3797 -0
  319. package/deps/librdkafka/src-cpp/rdkafkacpp_int.h +1641 -0
  320. package/deps/librdkafka/tests/0000-unittests.c +72 -0
  321. package/deps/librdkafka/tests/0001-multiobj.c +102 -0
  322. package/deps/librdkafka/tests/0002-unkpart.c +244 -0
  323. package/deps/librdkafka/tests/0003-msgmaxsize.c +173 -0
  324. package/deps/librdkafka/tests/0004-conf.c +934 -0
  325. package/deps/librdkafka/tests/0005-order.c +133 -0
  326. package/deps/librdkafka/tests/0006-symbols.c +163 -0
  327. package/deps/librdkafka/tests/0007-autotopic.c +136 -0
  328. package/deps/librdkafka/tests/0008-reqacks.c +179 -0
  329. package/deps/librdkafka/tests/0009-mock_cluster.c +97 -0
  330. package/deps/librdkafka/tests/0011-produce_batch.c +753 -0
  331. package/deps/librdkafka/tests/0012-produce_consume.c +537 -0
  332. package/deps/librdkafka/tests/0013-null-msgs.c +473 -0
  333. package/deps/librdkafka/tests/0014-reconsume-191.c +512 -0
  334. package/deps/librdkafka/tests/0015-offset_seeks.c +172 -0
  335. package/deps/librdkafka/tests/0016-client_swname.c +181 -0
  336. package/deps/librdkafka/tests/0017-compression.c +140 -0
  337. package/deps/librdkafka/tests/0018-cgrp_term.c +338 -0
  338. package/deps/librdkafka/tests/0019-list_groups.c +289 -0
  339. package/deps/librdkafka/tests/0020-destroy_hang.c +162 -0
  340. package/deps/librdkafka/tests/0021-rkt_destroy.c +72 -0
  341. package/deps/librdkafka/tests/0022-consume_batch.c +279 -0
  342. package/deps/librdkafka/tests/0025-timers.c +147 -0
  343. package/deps/librdkafka/tests/0026-consume_pause.c +547 -0
  344. package/deps/librdkafka/tests/0028-long_topicnames.c +79 -0
  345. package/deps/librdkafka/tests/0029-assign_offset.c +202 -0
  346. package/deps/librdkafka/tests/0030-offset_commit.c +589 -0
  347. package/deps/librdkafka/tests/0031-get_offsets.c +235 -0
  348. package/deps/librdkafka/tests/0033-regex_subscribe.c +536 -0
  349. package/deps/librdkafka/tests/0034-offset_reset.c +398 -0
  350. package/deps/librdkafka/tests/0035-api_version.c +73 -0
  351. package/deps/librdkafka/tests/0036-partial_fetch.c +87 -0
  352. package/deps/librdkafka/tests/0037-destroy_hang_local.c +85 -0
  353. package/deps/librdkafka/tests/0038-performance.c +121 -0
  354. package/deps/librdkafka/tests/0039-event.c +284 -0
  355. package/deps/librdkafka/tests/0040-io_event.c +257 -0
  356. package/deps/librdkafka/tests/0041-fetch_max_bytes.c +97 -0
  357. package/deps/librdkafka/tests/0042-many_topics.c +252 -0
  358. package/deps/librdkafka/tests/0043-no_connection.c +77 -0
  359. package/deps/librdkafka/tests/0044-partition_cnt.c +94 -0
  360. package/deps/librdkafka/tests/0045-subscribe_update.c +1010 -0
  361. package/deps/librdkafka/tests/0046-rkt_cache.c +65 -0
  362. package/deps/librdkafka/tests/0047-partial_buf_tmout.c +98 -0
  363. package/deps/librdkafka/tests/0048-partitioner.c +283 -0
  364. package/deps/librdkafka/tests/0049-consume_conn_close.c +162 -0
  365. package/deps/librdkafka/tests/0050-subscribe_adds.c +145 -0
  366. package/deps/librdkafka/tests/0051-assign_adds.c +126 -0
  367. package/deps/librdkafka/tests/0052-msg_timestamps.c +238 -0
  368. package/deps/librdkafka/tests/0053-stats_cb.cpp +527 -0
  369. package/deps/librdkafka/tests/0054-offset_time.cpp +236 -0
  370. package/deps/librdkafka/tests/0055-producer_latency.c +539 -0
  371. package/deps/librdkafka/tests/0056-balanced_group_mt.c +315 -0
  372. package/deps/librdkafka/tests/0057-invalid_topic.cpp +112 -0
  373. package/deps/librdkafka/tests/0058-log.cpp +123 -0
  374. package/deps/librdkafka/tests/0059-bsearch.cpp +241 -0
  375. package/deps/librdkafka/tests/0060-op_prio.cpp +163 -0
  376. package/deps/librdkafka/tests/0061-consumer_lag.cpp +295 -0
  377. package/deps/librdkafka/tests/0062-stats_event.c +126 -0
  378. package/deps/librdkafka/tests/0063-clusterid.cpp +180 -0
  379. package/deps/librdkafka/tests/0064-interceptors.c +481 -0
  380. package/deps/librdkafka/tests/0065-yield.cpp +140 -0
  381. package/deps/librdkafka/tests/0066-plugins.cpp +129 -0
  382. package/deps/librdkafka/tests/0067-empty_topic.cpp +151 -0
  383. package/deps/librdkafka/tests/0068-produce_timeout.c +136 -0
  384. package/deps/librdkafka/tests/0069-consumer_add_parts.c +119 -0
  385. package/deps/librdkafka/tests/0070-null_empty.cpp +197 -0
  386. package/deps/librdkafka/tests/0072-headers_ut.c +448 -0
  387. package/deps/librdkafka/tests/0073-headers.c +381 -0
  388. package/deps/librdkafka/tests/0074-producev.c +87 -0
  389. package/deps/librdkafka/tests/0075-retry.c +290 -0
  390. package/deps/librdkafka/tests/0076-produce_retry.c +452 -0
  391. package/deps/librdkafka/tests/0077-compaction.c +363 -0
  392. package/deps/librdkafka/tests/0078-c_from_cpp.cpp +96 -0
  393. package/deps/librdkafka/tests/0079-fork.c +93 -0
  394. package/deps/librdkafka/tests/0080-admin_ut.c +3095 -0
  395. package/deps/librdkafka/tests/0081-admin.c +5633 -0
  396. package/deps/librdkafka/tests/0082-fetch_max_bytes.cpp +137 -0
  397. package/deps/librdkafka/tests/0083-cb_event.c +233 -0
  398. package/deps/librdkafka/tests/0084-destroy_flags.c +208 -0
  399. package/deps/librdkafka/tests/0085-headers.cpp +392 -0
  400. package/deps/librdkafka/tests/0086-purge.c +368 -0
  401. package/deps/librdkafka/tests/0088-produce_metadata_timeout.c +162 -0
  402. package/deps/librdkafka/tests/0089-max_poll_interval.c +511 -0
  403. package/deps/librdkafka/tests/0090-idempotence.c +171 -0
  404. package/deps/librdkafka/tests/0091-max_poll_interval_timeout.c +295 -0
  405. package/deps/librdkafka/tests/0092-mixed_msgver.c +103 -0
  406. package/deps/librdkafka/tests/0093-holb.c +200 -0
  407. package/deps/librdkafka/tests/0094-idempotence_msg_timeout.c +231 -0
  408. package/deps/librdkafka/tests/0095-all_brokers_down.cpp +122 -0
  409. package/deps/librdkafka/tests/0097-ssl_verify.cpp +658 -0
  410. package/deps/librdkafka/tests/0098-consumer-txn.cpp +1218 -0
  411. package/deps/librdkafka/tests/0099-commit_metadata.c +194 -0
  412. package/deps/librdkafka/tests/0100-thread_interceptors.cpp +195 -0
  413. package/deps/librdkafka/tests/0101-fetch-from-follower.cpp +446 -0
  414. package/deps/librdkafka/tests/0102-static_group_rebalance.c +836 -0
  415. package/deps/librdkafka/tests/0103-transactions.c +1383 -0
  416. package/deps/librdkafka/tests/0104-fetch_from_follower_mock.c +625 -0
  417. package/deps/librdkafka/tests/0105-transactions_mock.c +3930 -0
  418. package/deps/librdkafka/tests/0106-cgrp_sess_timeout.c +318 -0
  419. package/deps/librdkafka/tests/0107-topic_recreate.c +259 -0
  420. package/deps/librdkafka/tests/0109-auto_create_topics.cpp +278 -0
  421. package/deps/librdkafka/tests/0110-batch_size.cpp +182 -0
  422. package/deps/librdkafka/tests/0111-delay_create_topics.cpp +127 -0
  423. package/deps/librdkafka/tests/0112-assign_unknown_part.c +87 -0
  424. package/deps/librdkafka/tests/0113-cooperative_rebalance.cpp +3473 -0
  425. package/deps/librdkafka/tests/0114-sticky_partitioning.cpp +176 -0
  426. package/deps/librdkafka/tests/0115-producer_auth.cpp +182 -0
  427. package/deps/librdkafka/tests/0116-kafkaconsumer_close.cpp +216 -0
  428. package/deps/librdkafka/tests/0117-mock_errors.c +331 -0
  429. package/deps/librdkafka/tests/0118-commit_rebalance.c +154 -0
  430. package/deps/librdkafka/tests/0119-consumer_auth.cpp +167 -0
  431. package/deps/librdkafka/tests/0120-asymmetric_subscription.c +185 -0
  432. package/deps/librdkafka/tests/0121-clusterid.c +115 -0
  433. package/deps/librdkafka/tests/0122-buffer_cleaning_after_rebalance.c +227 -0
  434. package/deps/librdkafka/tests/0123-connections_max_idle.c +98 -0
  435. package/deps/librdkafka/tests/0124-openssl_invalid_engine.c +69 -0
  436. package/deps/librdkafka/tests/0125-immediate_flush.c +144 -0
  437. package/deps/librdkafka/tests/0126-oauthbearer_oidc.c +528 -0
  438. package/deps/librdkafka/tests/0127-fetch_queue_backoff.cpp +165 -0
  439. package/deps/librdkafka/tests/0128-sasl_callback_queue.cpp +125 -0
  440. package/deps/librdkafka/tests/0129-fetch_aborted_msgs.c +79 -0
  441. package/deps/librdkafka/tests/0130-store_offsets.c +178 -0
  442. package/deps/librdkafka/tests/0131-connect_timeout.c +81 -0
  443. package/deps/librdkafka/tests/0132-strategy_ordering.c +179 -0
  444. package/deps/librdkafka/tests/0133-ssl_keys.c +150 -0
  445. package/deps/librdkafka/tests/0134-ssl_provider.c +92 -0
  446. package/deps/librdkafka/tests/0135-sasl_credentials.cpp +143 -0
  447. package/deps/librdkafka/tests/0136-resolve_cb.c +181 -0
  448. package/deps/librdkafka/tests/0137-barrier_batch_consume.c +619 -0
  449. package/deps/librdkafka/tests/0138-admin_mock.c +281 -0
  450. package/deps/librdkafka/tests/0139-offset_validation_mock.c +950 -0
  451. package/deps/librdkafka/tests/0140-commit_metadata.cpp +108 -0
  452. package/deps/librdkafka/tests/0142-reauthentication.c +515 -0
  453. package/deps/librdkafka/tests/0143-exponential_backoff_mock.c +552 -0
  454. package/deps/librdkafka/tests/0144-idempotence_mock.c +373 -0
  455. package/deps/librdkafka/tests/0145-pause_resume_mock.c +119 -0
  456. package/deps/librdkafka/tests/0146-metadata_mock.c +505 -0
  457. package/deps/librdkafka/tests/0147-consumer_group_consumer_mock.c +952 -0
  458. package/deps/librdkafka/tests/0148-offset_fetch_commit_error_mock.c +563 -0
  459. package/deps/librdkafka/tests/0149-broker-same-host-port.c +140 -0
  460. package/deps/librdkafka/tests/0150-telemetry_mock.c +651 -0
  461. package/deps/librdkafka/tests/0151-purge-brokers.c +566 -0
  462. package/deps/librdkafka/tests/0152-rebootstrap.c +59 -0
  463. package/deps/librdkafka/tests/0153-memberid.c +128 -0
  464. package/deps/librdkafka/tests/1000-unktopic.c +164 -0
  465. package/deps/librdkafka/tests/8000-idle.cpp +60 -0
  466. package/deps/librdkafka/tests/8001-fetch_from_follower_mock_manual.c +113 -0
  467. package/deps/librdkafka/tests/CMakeLists.txt +170 -0
  468. package/deps/librdkafka/tests/LibrdkafkaTestApp.py +291 -0
  469. package/deps/librdkafka/tests/Makefile +182 -0
  470. package/deps/librdkafka/tests/README.md +509 -0
  471. package/deps/librdkafka/tests/autotest.sh +33 -0
  472. package/deps/librdkafka/tests/backtrace.gdb +30 -0
  473. package/deps/librdkafka/tests/broker_version_tests.py +315 -0
  474. package/deps/librdkafka/tests/buildbox.sh +17 -0
  475. package/deps/librdkafka/tests/cleanup-checker-tests.sh +20 -0
  476. package/deps/librdkafka/tests/cluster_testing.py +191 -0
  477. package/deps/librdkafka/tests/delete-test-topics.sh +56 -0
  478. package/deps/librdkafka/tests/fixtures/oauthbearer/jwt_assertion_template.json +10 -0
  479. package/deps/librdkafka/tests/fixtures/ssl/Makefile +8 -0
  480. package/deps/librdkafka/tests/fixtures/ssl/README.md +13 -0
  481. package/deps/librdkafka/tests/fixtures/ssl/client.keystore.intermediate.p12 +0 -0
  482. package/deps/librdkafka/tests/fixtures/ssl/client.keystore.p12 +0 -0
  483. package/deps/librdkafka/tests/fixtures/ssl/client2.certificate.intermediate.pem +72 -0
  484. package/deps/librdkafka/tests/fixtures/ssl/client2.certificate.pem +50 -0
  485. package/deps/librdkafka/tests/fixtures/ssl/client2.intermediate.key +46 -0
  486. package/deps/librdkafka/tests/fixtures/ssl/client2.key +46 -0
  487. package/deps/librdkafka/tests/fixtures/ssl/create_keys.sh +168 -0
  488. package/deps/librdkafka/tests/fuzzers/Makefile +12 -0
  489. package/deps/librdkafka/tests/fuzzers/README.md +31 -0
  490. package/deps/librdkafka/tests/fuzzers/fuzz_regex.c +74 -0
  491. package/deps/librdkafka/tests/fuzzers/helpers.h +90 -0
  492. package/deps/librdkafka/tests/gen-ssl-certs.sh +165 -0
  493. package/deps/librdkafka/tests/interactive_broker_version.py +170 -0
  494. package/deps/librdkafka/tests/interceptor_test/CMakeLists.txt +16 -0
  495. package/deps/librdkafka/tests/interceptor_test/Makefile +22 -0
  496. package/deps/librdkafka/tests/interceptor_test/interceptor_test.c +314 -0
  497. package/deps/librdkafka/tests/interceptor_test/interceptor_test.h +54 -0
  498. package/deps/librdkafka/tests/java/IncrementalRebalanceCli.java +97 -0
  499. package/deps/librdkafka/tests/java/Makefile +13 -0
  500. package/deps/librdkafka/tests/java/Murmur2Cli.java +46 -0
  501. package/deps/librdkafka/tests/java/README.md +14 -0
  502. package/deps/librdkafka/tests/java/TransactionProducerCli.java +162 -0
  503. package/deps/librdkafka/tests/java/run-class.sh +11 -0
  504. package/deps/librdkafka/tests/librdkafka.suppressions +483 -0
  505. package/deps/librdkafka/tests/lz4_manual_test.sh +59 -0
  506. package/deps/librdkafka/tests/multi-broker-version-test.sh +50 -0
  507. package/deps/librdkafka/tests/parse-refcnt.sh +43 -0
  508. package/deps/librdkafka/tests/performance_plot.py +115 -0
  509. package/deps/librdkafka/tests/plugin_test/Makefile +19 -0
  510. package/deps/librdkafka/tests/plugin_test/plugin_test.c +58 -0
  511. package/deps/librdkafka/tests/requirements.txt +2 -0
  512. package/deps/librdkafka/tests/run-all-tests.sh +79 -0
  513. package/deps/librdkafka/tests/run-consumer-tests.sh +16 -0
  514. package/deps/librdkafka/tests/run-producer-tests.sh +16 -0
  515. package/deps/librdkafka/tests/run-test-batches.py +157 -0
  516. package/deps/librdkafka/tests/run-test.sh +140 -0
  517. package/deps/librdkafka/tests/rusage.c +249 -0
  518. package/deps/librdkafka/tests/sasl_test.py +289 -0
  519. package/deps/librdkafka/tests/scenarios/README.md +6 -0
  520. package/deps/librdkafka/tests/scenarios/ak23.json +6 -0
  521. package/deps/librdkafka/tests/scenarios/default.json +5 -0
  522. package/deps/librdkafka/tests/scenarios/noautocreate.json +5 -0
  523. package/deps/librdkafka/tests/sockem.c +801 -0
  524. package/deps/librdkafka/tests/sockem.h +85 -0
  525. package/deps/librdkafka/tests/sockem_ctrl.c +145 -0
  526. package/deps/librdkafka/tests/sockem_ctrl.h +61 -0
  527. package/deps/librdkafka/tests/test.c +7778 -0
  528. package/deps/librdkafka/tests/test.conf.example +27 -0
  529. package/deps/librdkafka/tests/test.h +1028 -0
  530. package/deps/librdkafka/tests/testcpp.cpp +131 -0
  531. package/deps/librdkafka/tests/testcpp.h +388 -0
  532. package/deps/librdkafka/tests/testshared.h +416 -0
  533. package/deps/librdkafka/tests/tools/README.md +4 -0
  534. package/deps/librdkafka/tests/tools/stats/README.md +21 -0
  535. package/deps/librdkafka/tests/tools/stats/filter.jq +42 -0
  536. package/deps/librdkafka/tests/tools/stats/graph.py +150 -0
  537. package/deps/librdkafka/tests/tools/stats/requirements.txt +3 -0
  538. package/deps/librdkafka/tests/tools/stats/to_csv.py +124 -0
  539. package/deps/librdkafka/tests/trivup/trivup-0.14.0.tar.gz +0 -0
  540. package/deps/librdkafka/tests/until-fail.sh +87 -0
  541. package/deps/librdkafka/tests/xxxx-assign_partition.c +122 -0
  542. package/deps/librdkafka/tests/xxxx-metadata.cpp +159 -0
  543. package/deps/librdkafka/vcpkg.json +23 -0
  544. package/deps/librdkafka/win32/README.md +5 -0
  545. package/deps/librdkafka/win32/build-package.bat +3 -0
  546. package/deps/librdkafka/win32/build.bat +19 -0
  547. package/deps/librdkafka/win32/common.vcxproj +84 -0
  548. package/deps/librdkafka/win32/interceptor_test/interceptor_test.vcxproj +87 -0
  549. package/deps/librdkafka/win32/librdkafka.autopkg.template +54 -0
  550. package/deps/librdkafka/win32/librdkafka.master.testing.targets +13 -0
  551. package/deps/librdkafka/win32/librdkafka.sln +226 -0
  552. package/deps/librdkafka/win32/librdkafka.vcxproj +276 -0
  553. package/deps/librdkafka/win32/librdkafkacpp/librdkafkacpp.vcxproj +104 -0
  554. package/deps/librdkafka/win32/msbuild.ps1 +15 -0
  555. package/deps/librdkafka/win32/openssl_engine_example/openssl_engine_example.vcxproj +132 -0
  556. package/deps/librdkafka/win32/package-zip.ps1 +46 -0
  557. package/deps/librdkafka/win32/packages/repositories.config +4 -0
  558. package/deps/librdkafka/win32/push-package.bat +4 -0
  559. package/deps/librdkafka/win32/rdkafka_complex_consumer_example_cpp/rdkafka_complex_consumer_example_cpp.vcxproj +67 -0
  560. package/deps/librdkafka/win32/rdkafka_example/rdkafka_example.vcxproj +97 -0
  561. package/deps/librdkafka/win32/rdkafka_performance/rdkafka_performance.vcxproj +97 -0
  562. package/deps/librdkafka/win32/setup-msys2.ps1 +47 -0
  563. package/deps/librdkafka/win32/setup-vcpkg.ps1 +34 -0
  564. package/deps/librdkafka/win32/tests/test.conf.example +25 -0
  565. package/deps/librdkafka/win32/tests/tests.vcxproj +253 -0
  566. package/deps/librdkafka/win32/win_ssl_cert_store/win_ssl_cert_store.vcxproj +132 -0
  567. package/deps/librdkafka/win32/wingetopt.c +564 -0
  568. package/deps/librdkafka/win32/wingetopt.h +101 -0
  569. package/deps/librdkafka/win32/wintime.h +33 -0
  570. package/deps/librdkafka.gyp +83 -0
  571. package/deps/windows-install.py +80 -0
  572. package/eslint.config.js +75 -0
  573. package/flake.lock +61 -0
  574. package/flake.nix +76 -0
  575. package/index.d.ts +3 -0
  576. package/jest.config.js +8 -0
  577. package/jsdoc.conf +23 -0
  578. package/lib/admin.js +732 -0
  579. package/lib/client.js +679 -0
  580. package/lib/error.js +501 -0
  581. package/lib/index.js +8 -0
  582. package/lib/kafka-consumer-stream.js +399 -0
  583. package/lib/kafka-consumer.js +798 -0
  584. package/lib/kafkajs/_admin.js +1053 -0
  585. package/lib/kafkajs/_common.js +887 -0
  586. package/lib/kafkajs/_consumer.js +2143 -0
  587. package/lib/kafkajs/_consumer_cache.js +310 -0
  588. package/lib/kafkajs/_error.js +298 -0
  589. package/lib/kafkajs/_kafka.js +125 -0
  590. package/lib/kafkajs/_linked-list.js +220 -0
  591. package/lib/kafkajs/_producer.js +863 -0
  592. package/lib/kafkajs/index.js +5 -0
  593. package/lib/producer/high-level-producer.js +400 -0
  594. package/lib/producer-stream.js +337 -0
  595. package/lib/producer.js +405 -0
  596. package/lib/rdkafka.js +44 -0
  597. package/lib/tools/ref-counter.js +53 -0
  598. package/lib/topic-partition.js +91 -0
  599. package/lib/topic.js +43 -0
  600. package/lib/util.js +55 -0
  601. package/librdkafka.js +12 -0
  602. package/make_docs.sh +57 -0
  603. package/package.json +59 -4
  604. package/run_docker.sh +42 -0
  605. package/service.yml +36 -0
  606. package/sonar-project.properties +9 -0
  607. package/src/admin.cc +1597 -0
  608. package/src/admin.h +112 -0
  609. package/src/binding.cc +76 -0
  610. package/src/binding.h +25 -0
  611. package/src/callbacks.cc +676 -0
  612. package/src/callbacks.h +302 -0
  613. package/src/common.cc +1601 -0
  614. package/src/common.h +192 -0
  615. package/src/config.cc +219 -0
  616. package/src/config.h +61 -0
  617. package/src/connection.cc +703 -0
  618. package/src/connection.h +117 -0
  619. package/src/errors.cc +119 -0
  620. package/src/errors.h +60 -0
  621. package/src/kafka-consumer.cc +1539 -0
  622. package/src/kafka-consumer.h +147 -0
  623. package/src/producer.cc +917 -0
  624. package/src/producer.h +124 -0
  625. package/src/topic.cc +173 -0
  626. package/src/topic.h +54 -0
  627. package/src/workers.cc +1714 -0
  628. package/src/workers.h +690 -0
  629. package/tsconfig.json +18 -0
  630. package/types/config.d.ts +1248 -0
  631. package/types/errors.d.ts +373 -0
  632. package/types/kafkajs.d.ts +568 -0
  633. package/types/rdkafka.d.ts +561 -0
  634. package/util/configure.js +34 -0
  635. package/util/generate-docs.sh +18 -0
  636. package/util/get-env.js +6 -0
  637. package/util/test-compile.js +11 -0
  638. package/util/test-producer-delivery.js +100 -0
  639. package/win_install.ps1 +2 -0
@@ -0,0 +1,997 @@
1
+ /*
2
+ * librdkafka - Apache Kafka C library
3
+ *
4
+ * Copyright (c) 2023, Confluent Inc.
5
+ * All rights reserved.
6
+ *
7
+ * Redistribution and use in source and binary forms, with or without
8
+ * modification, are permitted provided that the following conditions are met:
9
+ *
10
+ * 1. Redistributions of source code must retain the above copyright notice,
11
+ * this list of conditions and the following disclaimer.
12
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
13
+ * this list of conditions and the following disclaimer in the documentation
14
+ * and/or other materials provided with the distribution.
15
+ *
16
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26
+ * POSSIBILITY OF SUCH DAMAGE.
27
+ */
28
+
29
+ #include "rdkafka_telemetry_encode.h"
30
+ #include "nanopb/pb_encode.h"
31
+ #include "opentelemetry/metrics.pb.h"
32
+
33
+ #define THREE_ORDERS_MAGNITUDE 1000
34
+
35
+ typedef struct {
36
+ opentelemetry_proto_metrics_v1_Metric **metrics;
37
+ size_t count;
38
+ } rd_kafka_telemetry_metrics_repeated_t;
39
+
40
+ typedef struct {
41
+ opentelemetry_proto_common_v1_KeyValue **key_values;
42
+ size_t count;
43
+ } rd_kafka_telemetry_key_values_repeated_t;
44
+
45
+ #define calculate_avg(_avg_, _scale_factor_) \
46
+ ((_avg_).ra_v.avg / (double)_scale_factor_)
47
+
48
+ #define calculate_max(_avg_, _scale_factor_) \
49
+ RD_CEIL_INTEGER_DIVISION((_avg_).ra_v.maxv, _scale_factor_)
50
+
51
+ #define brokers_avg(_rk_, _avg_name_, _scale_factor_, _metric_) \
52
+ do { \
53
+ rd_kafka_broker_t *_rkb_; \
54
+ double avg = 0; \
55
+ int count = 0; \
56
+ TAILQ_FOREACH(_rkb_, &(_rk_)->rk_brokers, rkb_link) { \
57
+ rd_avg_t *rd_avg_rollover = \
58
+ &_rkb_->rkb_telemetry.rd_avg_rollover._avg_name_; \
59
+ if (rd_avg_rollover->ra_v.cnt) { \
60
+ avg = (avg * count + \
61
+ rd_avg_rollover->ra_v.sum) / \
62
+ (double)(count + \
63
+ rd_avg_rollover->ra_v.cnt); \
64
+ count += rd_avg_rollover->ra_v.cnt; \
65
+ } \
66
+ } \
67
+ if (_scale_factor_ > 1) \
68
+ (_metric_).double_value = avg / _scale_factor_; \
69
+ else \
70
+ (_metric_).double_value = avg; \
71
+ } while (0)
72
+
73
+ #define brokers_max(_rk_, _avg_name_, _scale_factor_, _metric_) \
74
+ do { \
75
+ rd_kafka_broker_t *_rkb_; \
76
+ _metric_.int_value = 0; \
77
+ TAILQ_FOREACH(_rkb_, &(_rk_)->rk_brokers, rkb_link) { \
78
+ _metric_.int_value = \
79
+ RD_MAX(_metric_.int_value, \
80
+ _rkb_->rkb_telemetry.rd_avg_rollover \
81
+ ._avg_name_.ra_v.maxv); \
82
+ } \
83
+ if (_scale_factor_ > 1) \
84
+ (_metric_).int_value = RD_CEIL_INTEGER_DIVISION( \
85
+ (_metric_).int_value, _scale_factor_); \
86
+ } while (0)
87
+
88
+ static rd_kafka_telemetry_metric_value_t
89
+ calculate_connection_creation_total(rd_kafka_t *rk,
90
+ rd_kafka_broker_t *rkb_selected,
91
+ rd_ts_t now_ns) {
92
+ rd_kafka_telemetry_metric_value_t total;
93
+ rd_kafka_broker_t *rkb;
94
+
95
+ total.int_value = 0;
96
+ TAILQ_FOREACH(rkb, &rk->rk_brokers, rkb_link) {
97
+ const int32_t connects = rd_atomic32_get(&rkb->rkb_c.connects);
98
+ if (!rk->rk_telemetry.delta_temporality)
99
+ total.int_value += connects;
100
+ else
101
+ total.int_value +=
102
+ connects -
103
+ rkb->rkb_telemetry.rkb_historic_c.connects;
104
+ }
105
+
106
+ return total;
107
+ }
108
+
109
+ static rd_kafka_telemetry_metric_value_t
110
+ calculate_connection_creation_rate(rd_kafka_t *rk,
111
+ rd_kafka_broker_t *rkb_selected,
112
+ rd_ts_t now_ns) {
113
+ rd_kafka_telemetry_metric_value_t total;
114
+ rd_kafka_broker_t *rkb;
115
+ rd_ts_t ts_last = rk->rk_telemetry.rk_historic_c.ts_last;
116
+
117
+ total.double_value = 0;
118
+ TAILQ_FOREACH(rkb, &rk->rk_brokers, rkb_link) {
119
+ total.double_value +=
120
+ rd_atomic32_get(&rkb->rkb_c.connects) -
121
+ rkb->rkb_telemetry.rkb_historic_c.connects;
122
+ }
123
+ double seconds = (now_ns - ts_last) / 1e9;
124
+ if (seconds > 1.0)
125
+ total.double_value /= seconds;
126
+ return total;
127
+ }
128
+
129
+ static rd_kafka_telemetry_metric_value_t
130
+ calculate_broker_avg_rtt(rd_kafka_t *rk,
131
+ rd_kafka_broker_t *rkb_selected,
132
+ rd_ts_t now_ns) {
133
+ rd_kafka_telemetry_metric_value_t avg_rtt = RD_ZERO_INIT;
134
+ avg_rtt.double_value = calculate_avg(
135
+ rkb_selected->rkb_telemetry.rd_avg_rollover.rkb_avg_rtt,
136
+ THREE_ORDERS_MAGNITUDE);
137
+ return avg_rtt;
138
+ }
139
+
140
+ static rd_kafka_telemetry_metric_value_t
141
+ calculate_broker_max_rtt(rd_kafka_t *rk,
142
+ rd_kafka_broker_t *rkb_selected,
143
+ rd_ts_t now_ns) {
144
+ rd_kafka_telemetry_metric_value_t max_rtt = RD_ZERO_INIT;
145
+ max_rtt.int_value = calculate_max(
146
+ rkb_selected->rkb_telemetry.rd_avg_rollover.rkb_avg_rtt,
147
+ THREE_ORDERS_MAGNITUDE);
148
+ return max_rtt;
149
+ }
150
+
151
+ static rd_kafka_telemetry_metric_value_t
152
+ calculate_produce_latency_avg(rd_kafka_t *rk,
153
+ rd_kafka_broker_t *rkb_selected,
154
+ rd_ts_t now_ns) {
155
+ rd_kafka_telemetry_metric_value_t avg_rtt = RD_ZERO_INIT;
156
+ brokers_avg(rk, rkb_avg_produce_latency, THREE_ORDERS_MAGNITUDE,
157
+ avg_rtt);
158
+ return avg_rtt;
159
+ }
160
+
161
+ static rd_kafka_telemetry_metric_value_t
162
+ calculate_produce_latency_max(rd_kafka_t *rk,
163
+ rd_kafka_broker_t *rkb_selected,
164
+ rd_ts_t now_ns) {
165
+ rd_kafka_telemetry_metric_value_t max_rtt = RD_ZERO_INIT;
166
+ brokers_max(rk, rkb_avg_produce_latency, THREE_ORDERS_MAGNITUDE,
167
+ max_rtt);
168
+ return max_rtt;
169
+ }
170
+
171
+ static rd_kafka_telemetry_metric_value_t
172
+ calculate_throttle_avg(rd_kafka_t *rk,
173
+ rd_kafka_broker_t *rkb_selected,
174
+ rd_ts_t now_ns) {
175
+ rd_kafka_telemetry_metric_value_t avg_throttle;
176
+ brokers_avg(rk, rkb_avg_throttle, 1, avg_throttle);
177
+ return avg_throttle;
178
+ }
179
+
180
+
181
+ static rd_kafka_telemetry_metric_value_t
182
+ calculate_throttle_max(rd_kafka_t *rk,
183
+ rd_kafka_broker_t *rkb_selected,
184
+ rd_ts_t now_ns) {
185
+ rd_kafka_telemetry_metric_value_t max_throttle;
186
+ brokers_max(rk, rkb_avg_throttle, 1, max_throttle);
187
+ return max_throttle;
188
+ }
189
+
190
+ static rd_kafka_telemetry_metric_value_t
191
+ calculate_queue_time_avg(rd_kafka_t *rk,
192
+ rd_kafka_broker_t *rkb_selected,
193
+ rd_ts_t now_ns) {
194
+ rd_kafka_telemetry_metric_value_t avg_queue_time;
195
+ brokers_avg(rk, rkb_avg_outbuf_latency, THREE_ORDERS_MAGNITUDE,
196
+ avg_queue_time);
197
+ return avg_queue_time;
198
+ }
199
+
200
+ static rd_kafka_telemetry_metric_value_t
201
+ calculate_queue_time_max(rd_kafka_t *rk,
202
+ rd_kafka_broker_t *rkb_selected,
203
+ rd_ts_t now_ns) {
204
+ rd_kafka_telemetry_metric_value_t max_queue_time;
205
+ brokers_max(rk, rkb_avg_outbuf_latency, THREE_ORDERS_MAGNITUDE,
206
+ max_queue_time);
207
+ return max_queue_time;
208
+ }
209
+
210
+ static rd_kafka_telemetry_metric_value_t
211
+ calculate_consumer_assigned_partitions(rd_kafka_t *rk,
212
+ rd_kafka_broker_t *rkb_selected,
213
+ rd_ts_t now_ns) {
214
+ rd_kafka_telemetry_metric_value_t assigned_partitions;
215
+
216
+ assigned_partitions.int_value =
217
+ rk->rk_cgrp ? rk->rk_cgrp->rkcg_c.assignment_size : 0;
218
+ return assigned_partitions;
219
+ }
220
+
221
+ static rd_kafka_telemetry_metric_value_t
222
+ calculate_consumer_rebalance_latency_avg(rd_kafka_t *rk,
223
+ rd_kafka_broker_t *rkb_selected,
224
+ rd_ts_t now_ns) {
225
+ rd_kafka_telemetry_metric_value_t avg_rebalance_time;
226
+ avg_rebalance_time.double_value = calculate_avg(
227
+ rk->rk_telemetry.rd_avg_rollover.rk_avg_rebalance_latency,
228
+ THREE_ORDERS_MAGNITUDE);
229
+ return avg_rebalance_time;
230
+ }
231
+
232
+ static rd_kafka_telemetry_metric_value_t
233
+ calculate_consumer_rebalance_latency_max(rd_kafka_t *rk,
234
+ rd_kafka_broker_t *rkb_selected,
235
+ rd_ts_t now_ns) {
236
+ rd_kafka_telemetry_metric_value_t max_rebalance_time;
237
+ max_rebalance_time.int_value = calculate_max(
238
+ rk->rk_telemetry.rd_avg_rollover.rk_avg_rebalance_latency,
239
+ THREE_ORDERS_MAGNITUDE);
240
+ return max_rebalance_time;
241
+ }
242
+
243
+ static rd_kafka_telemetry_metric_value_t
244
+ calculate_consumer_rebalance_latency_total(rd_kafka_t *rk,
245
+ rd_kafka_broker_t *rkb_selected,
246
+ rd_ts_t now_ns) {
247
+ rd_kafka_telemetry_metric_value_t total_rebalance_time;
248
+ total_rebalance_time.int_value = RD_CEIL_INTEGER_DIVISION(
249
+ rk->rk_telemetry.rd_avg_rollover.rk_avg_rebalance_latency.ra_v.sum,
250
+ THREE_ORDERS_MAGNITUDE);
251
+ if (!rk->rk_telemetry.delta_temporality) {
252
+ total_rebalance_time.int_value +=
253
+ rk->rk_telemetry.rk_historic_c.rebalance_latency_total;
254
+ }
255
+ return total_rebalance_time;
256
+ }
257
+
258
+ static rd_kafka_telemetry_metric_value_t
259
+ calculate_consumer_fetch_latency_avg(rd_kafka_t *rk,
260
+ rd_kafka_broker_t *rkb_selected,
261
+ rd_ts_t now_ns) {
262
+ rd_kafka_telemetry_metric_value_t avg_fetch_time;
263
+ brokers_avg(rk, rkb_avg_fetch_latency, THREE_ORDERS_MAGNITUDE,
264
+ avg_fetch_time);
265
+ return avg_fetch_time;
266
+ }
267
+
268
+ static rd_kafka_telemetry_metric_value_t
269
+ calculate_consumer_fetch_latency_max(rd_kafka_t *rk,
270
+ rd_kafka_broker_t *rkb_selected,
271
+ rd_ts_t now_ns) {
272
+ rd_kafka_telemetry_metric_value_t max_fetch_time;
273
+ brokers_max(rk, rkb_avg_fetch_latency, THREE_ORDERS_MAGNITUDE,
274
+ max_fetch_time);
275
+ return max_fetch_time;
276
+ }
277
+
278
+ static rd_kafka_telemetry_metric_value_t
279
+ calculate_consumer_poll_idle_ratio_avg(rd_kafka_t *rk,
280
+ rd_kafka_broker_t *rkb_selected,
281
+ rd_ts_t now_ns) {
282
+ rd_kafka_telemetry_metric_value_t avg_poll_idle_avg;
283
+ avg_poll_idle_avg.double_value = calculate_avg(
284
+ rk->rk_telemetry.rd_avg_rollover.rk_avg_poll_idle_ratio, 1e6);
285
+ return avg_poll_idle_avg;
286
+ }
287
+
288
+ static rd_kafka_telemetry_metric_value_t
289
+ calculate_consumer_commit_latency_avg(rd_kafka_t *rk,
290
+ rd_kafka_broker_t *rkb_selected,
291
+ rd_ts_t now_ns) {
292
+ rd_kafka_telemetry_metric_value_t avg_commit_time;
293
+ avg_commit_time.double_value = calculate_avg(
294
+ rk->rk_telemetry.rd_avg_rollover.rk_avg_commit_latency,
295
+ THREE_ORDERS_MAGNITUDE);
296
+ return avg_commit_time;
297
+ }
298
+
299
+ static rd_kafka_telemetry_metric_value_t
300
+ calculate_consumer_commit_latency_max(rd_kafka_t *rk,
301
+ rd_kafka_broker_t *rkb_selected,
302
+ rd_ts_t now_ns) {
303
+ rd_kafka_telemetry_metric_value_t max_commit_time;
304
+ max_commit_time.int_value = calculate_max(
305
+ rk->rk_telemetry.rd_avg_rollover.rk_avg_commit_latency,
306
+ THREE_ORDERS_MAGNITUDE);
307
+ return max_commit_time;
308
+ }
309
+
310
+ static void reset_historical_metrics(rd_kafka_t *rk, rd_ts_t now_ns) {
311
+ rd_kafka_broker_t *rkb;
312
+
313
+ rk->rk_telemetry.rk_historic_c.ts_last = now_ns;
314
+ rk->rk_telemetry.rk_historic_c.rebalance_latency_total +=
315
+ RD_CEIL_INTEGER_DIVISION(rk->rk_telemetry.rd_avg_rollover
316
+ .rk_avg_rebalance_latency.ra_v.sum,
317
+ THREE_ORDERS_MAGNITUDE);
318
+
319
+ TAILQ_FOREACH(rkb, &rk->rk_brokers, rkb_link) {
320
+ rkb->rkb_telemetry.rkb_historic_c.connects =
321
+ rd_atomic32_get(&rkb->rkb_c.connects);
322
+ }
323
+ }
324
+
325
+ static const rd_kafka_telemetry_metric_value_calculator_t
326
+ PRODUCER_METRIC_VALUE_CALCULATORS[RD_KAFKA_TELEMETRY_PRODUCER_METRIC__CNT] =
327
+ {
328
+ [RD_KAFKA_TELEMETRY_METRIC_PRODUCER_CONNECTION_CREATION_RATE] =
329
+ &calculate_connection_creation_rate,
330
+ [RD_KAFKA_TELEMETRY_METRIC_PRODUCER_CONNECTION_CREATION_TOTAL] =
331
+ &calculate_connection_creation_total,
332
+ [RD_KAFKA_TELEMETRY_METRIC_PRODUCER_NODE_REQUEST_LATENCY_AVG] =
333
+ &calculate_broker_avg_rtt,
334
+ [RD_KAFKA_TELEMETRY_METRIC_PRODUCER_NODE_REQUEST_LATENCY_MAX] =
335
+ &calculate_broker_max_rtt,
336
+ [RD_KAFKA_TELEMETRY_METRIC_PRODUCER_PRODUCE_THROTTLE_TIME_AVG] =
337
+ &calculate_throttle_avg,
338
+ [RD_KAFKA_TELEMETRY_METRIC_PRODUCER_PRODUCE_THROTTLE_TIME_MAX] =
339
+ &calculate_throttle_max,
340
+ [RD_KAFKA_TELEMETRY_METRIC_PRODUCER_RECORD_QUEUE_TIME_AVG] =
341
+ &calculate_queue_time_avg,
342
+ [RD_KAFKA_TELEMETRY_METRIC_PRODUCER_RECORD_QUEUE_TIME_MAX] =
343
+ &calculate_queue_time_max,
344
+ [RD_KAFKA_TELEMETRY_METRIC_PRODUCER_PRODUCE_LATENCY_AVG] =
345
+ &calculate_produce_latency_avg,
346
+ [RD_KAFKA_TELEMETRY_METRIC_PRODUCER_PRODUCE_LATENCY_MAX] =
347
+ &calculate_produce_latency_max,
348
+ };
349
+
350
+ static const rd_kafka_telemetry_metric_value_calculator_t
351
+ CONSUMER_METRIC_VALUE_CALCULATORS[RD_KAFKA_TELEMETRY_CONSUMER_METRIC__CNT] = {
352
+ [RD_KAFKA_TELEMETRY_METRIC_CONSUMER_CONNECTION_CREATION_RATE] =
353
+ &calculate_connection_creation_rate,
354
+ [RD_KAFKA_TELEMETRY_METRIC_CONSUMER_CONNECTION_CREATION_TOTAL] =
355
+ &calculate_connection_creation_total,
356
+ [RD_KAFKA_TELEMETRY_METRIC_CONSUMER_NODE_REQUEST_LATENCY_AVG] =
357
+ &calculate_broker_avg_rtt,
358
+ [RD_KAFKA_TELEMETRY_METRIC_CONSUMER_NODE_REQUEST_LATENCY_MAX] =
359
+ &calculate_broker_max_rtt,
360
+ [RD_KAFKA_TELEMETRY_METRIC_CONSUMER_COORDINATOR_ASSIGNED_PARTITIONS] =
361
+ &calculate_consumer_assigned_partitions,
362
+ [RD_KAFKA_TELEMETRY_METRIC_CONSUMER_COORDINATOR_REBALANCE_LATENCY_AVG] =
363
+ &calculate_consumer_rebalance_latency_avg,
364
+ [RD_KAFKA_TELEMETRY_METRIC_CONSUMER_COORDINATOR_REBALANCE_LATENCY_MAX] =
365
+ &calculate_consumer_rebalance_latency_max,
366
+ [RD_KAFKA_TELEMETRY_METRIC_CONSUMER_COORDINATOR_REBALANCE_LATENCY_TOTAL] =
367
+ &calculate_consumer_rebalance_latency_total,
368
+ [RD_KAFKA_TELEMETRY_METRIC_CONSUMER_FETCH_MANAGER_FETCH_LATENCY_AVG] =
369
+ &calculate_consumer_fetch_latency_avg,
370
+ [RD_KAFKA_TELEMETRY_METRIC_CONSUMER_FETCH_MANAGER_FETCH_LATENCY_MAX] =
371
+ &calculate_consumer_fetch_latency_max,
372
+ [RD_KAFKA_TELEMETRY_METRIC_CONSUMER_POLL_IDLE_RATIO_AVG] =
373
+ &calculate_consumer_poll_idle_ratio_avg,
374
+ [RD_KAFKA_TELEMETRY_METRIC_CONSUMER_COORDINATOR_COMMIT_LATENCY_AVG] =
375
+ &calculate_consumer_commit_latency_avg,
376
+ [RD_KAFKA_TELEMETRY_METRIC_CONSUMER_COORDINATOR_COMMIT_LATENCY_MAX] =
377
+ &calculate_consumer_commit_latency_max,
378
+ };
379
+
380
+ static const char *get_client_rack(const rd_kafka_t *rk) {
381
+ return rk->rk_conf.client_rack &&
382
+ RD_KAFKAP_STR_LEN(rk->rk_conf.client_rack)
383
+ ? (const char *)rk->rk_conf.client_rack->str
384
+ : NULL;
385
+ }
386
+
387
+ static const char *get_group_id(const rd_kafka_t *rk) {
388
+ return rk->rk_conf.group_id_str ? (const char *)rk->rk_conf.group_id_str
389
+ : NULL;
390
+ }
391
+
392
+ static const char *get_group_instance_id(const rd_kafka_t *rk) {
393
+ return rk->rk_conf.group_instance_id
394
+ ? (const char *)rk->rk_conf.group_instance_id
395
+ : NULL;
396
+ }
397
+
398
+ static const char *get_member_id(const rd_kafka_t *rk) {
399
+ return rk->rk_cgrp && rk->rk_cgrp->rkcg_member_id &&
400
+ rk->rk_cgrp->rkcg_member_id->len > 0
401
+ ? (const char *)rk->rk_cgrp->rkcg_member_id->str
402
+ : NULL;
403
+ }
404
+
405
+ static const char *get_transactional_id(const rd_kafka_t *rk) {
406
+ return rk->rk_conf.eos.transactional_id
407
+ ? (const char *)rk->rk_conf.eos.transactional_id
408
+ : NULL;
409
+ }
410
+
411
+ static const rd_kafka_telemetry_attribute_config_t producer_attributes[] = {
412
+ {"client_rack", get_client_rack},
413
+ {"transactional_id", get_transactional_id},
414
+ };
415
+
416
+ static const rd_kafka_telemetry_attribute_config_t consumer_attributes[] = {
417
+ {"client_rack", get_client_rack},
418
+ {"group_id", get_group_id},
419
+ {"group_instance_id", get_group_instance_id},
420
+ {"member_id", get_member_id},
421
+ };
422
+
423
+ static int
424
+ count_attributes(rd_kafka_t *rk,
425
+ const rd_kafka_telemetry_attribute_config_t *configs,
426
+ int config_count) {
427
+ int count = 0, i;
428
+ for (i = 0; i < config_count; ++i) {
429
+ if (configs[i].getValue(rk)) {
430
+ count++;
431
+ }
432
+ }
433
+ return count;
434
+ }
435
+
436
+ static void set_attributes(rd_kafka_t *rk,
437
+ rd_kafka_telemetry_resource_attribute_t *attributes,
438
+ const rd_kafka_telemetry_attribute_config_t *configs,
439
+ int config_count) {
440
+ int attr_idx = 0, i;
441
+ for (i = 0; i < config_count; ++i) {
442
+ const char *value = configs[i].getValue(rk);
443
+ if (value) {
444
+ attributes[attr_idx].name = configs[i].name;
445
+ attributes[attr_idx].value = value;
446
+ attr_idx++;
447
+ }
448
+ }
449
+ }
450
+
451
+ static int
452
+ resource_attributes(rd_kafka_t *rk,
453
+ rd_kafka_telemetry_resource_attribute_t **attributes) {
454
+ int count = 0;
455
+ const rd_kafka_telemetry_attribute_config_t *configs;
456
+ int config_count;
457
+
458
+ if (rk->rk_type == RD_KAFKA_PRODUCER) {
459
+ configs = producer_attributes;
460
+ config_count = RD_ARRAY_SIZE(producer_attributes);
461
+ } else if (rk->rk_type == RD_KAFKA_CONSUMER) {
462
+ configs = consumer_attributes;
463
+ config_count = RD_ARRAY_SIZE(consumer_attributes);
464
+ } else {
465
+ *attributes = NULL;
466
+ return 0;
467
+ }
468
+
469
+ count = count_attributes(rk, configs, config_count);
470
+
471
+ if (count == 0) {
472
+ *attributes = NULL;
473
+ return 0;
474
+ }
475
+
476
+ *attributes =
477
+ rd_malloc(sizeof(rd_kafka_telemetry_resource_attribute_t) * count);
478
+
479
+ set_attributes(rk, *attributes, configs, config_count);
480
+
481
+ return count;
482
+ }
483
+
484
+ static bool
485
+ encode_string(pb_ostream_t *stream, const pb_field_t *field, void *const *arg) {
486
+ if (!pb_encode_tag_for_field(stream, field))
487
+ return false;
488
+ return pb_encode_string(stream, (uint8_t *)(*arg), strlen(*arg));
489
+ }
490
+
491
+ // TODO: Update to handle multiple data points.
492
+ static bool encode_number_data_point(pb_ostream_t *stream,
493
+ const pb_field_t *field,
494
+ void *const *arg) {
495
+ opentelemetry_proto_metrics_v1_NumberDataPoint *data_point =
496
+ (opentelemetry_proto_metrics_v1_NumberDataPoint *)*arg;
497
+ if (!pb_encode_tag_for_field(stream, field))
498
+ return false;
499
+
500
+ return pb_encode_submessage(
501
+ stream, opentelemetry_proto_metrics_v1_NumberDataPoint_fields,
502
+ data_point);
503
+ }
504
+
505
+ static bool
506
+ encode_metric(pb_ostream_t *stream, const pb_field_t *field, void *const *arg) {
507
+ rd_kafka_telemetry_metrics_repeated_t *metricArr =
508
+ (rd_kafka_telemetry_metrics_repeated_t *)*arg;
509
+ size_t i;
510
+
511
+ for (i = 0; i < metricArr->count; i++) {
512
+
513
+ opentelemetry_proto_metrics_v1_Metric *metric =
514
+ metricArr->metrics[i];
515
+ if (!pb_encode_tag_for_field(stream, field))
516
+ return false;
517
+
518
+ if (!pb_encode_submessage(
519
+ stream, opentelemetry_proto_metrics_v1_Metric_fields,
520
+ metric))
521
+ return false;
522
+ }
523
+ return true;
524
+ }
525
+
526
+ static bool encode_scope_metrics(pb_ostream_t *stream,
527
+ const pb_field_t *field,
528
+ void *const *arg) {
529
+ opentelemetry_proto_metrics_v1_ScopeMetrics *scope_metrics =
530
+ (opentelemetry_proto_metrics_v1_ScopeMetrics *)*arg;
531
+ if (!pb_encode_tag_for_field(stream, field))
532
+ return false;
533
+
534
+ return pb_encode_submessage(
535
+ stream, opentelemetry_proto_metrics_v1_ScopeMetrics_fields,
536
+ scope_metrics);
537
+ }
538
+
539
+ static bool encode_resource_metrics(pb_ostream_t *stream,
540
+ const pb_field_t *field,
541
+ void *const *arg) {
542
+ opentelemetry_proto_metrics_v1_ResourceMetrics *resource_metrics =
543
+ (opentelemetry_proto_metrics_v1_ResourceMetrics *)*arg;
544
+ if (!pb_encode_tag_for_field(stream, field))
545
+ return false;
546
+
547
+ return pb_encode_submessage(
548
+ stream, opentelemetry_proto_metrics_v1_ResourceMetrics_fields,
549
+ resource_metrics);
550
+ }
551
+
552
+ static bool encode_key_value(pb_ostream_t *stream,
553
+ const pb_field_t *field,
554
+ void *const *arg) {
555
+ if (!pb_encode_tag_for_field(stream, field))
556
+ return false;
557
+ opentelemetry_proto_common_v1_KeyValue *key_value =
558
+ (opentelemetry_proto_common_v1_KeyValue *)*arg;
559
+ return pb_encode_submessage(
560
+ stream, opentelemetry_proto_common_v1_KeyValue_fields, key_value);
561
+ }
562
+
563
+ static bool encode_key_values(pb_ostream_t *stream,
564
+ const pb_field_t *field,
565
+ void *const *arg) {
566
+ rd_kafka_telemetry_key_values_repeated_t *kv_arr =
567
+ (rd_kafka_telemetry_key_values_repeated_t *)*arg;
568
+ size_t i;
569
+
570
+ for (i = 0; i < kv_arr->count; i++) {
571
+
572
+ opentelemetry_proto_common_v1_KeyValue *kv =
573
+ kv_arr->key_values[i];
574
+ if (!pb_encode_tag_for_field(stream, field))
575
+ return false;
576
+
577
+ if (!pb_encode_submessage(
578
+ stream, opentelemetry_proto_common_v1_KeyValue_fields,
579
+ kv))
580
+ return false;
581
+ }
582
+ return true;
583
+ }
584
+
585
+ static void free_metrics(
586
+ opentelemetry_proto_metrics_v1_Metric **metrics,
587
+ char **metric_names,
588
+ opentelemetry_proto_metrics_v1_NumberDataPoint **data_points,
589
+ opentelemetry_proto_common_v1_KeyValue *datapoint_attributes_key_values,
590
+ size_t count) {
591
+ size_t i;
592
+ for (i = 0; i < count; i++) {
593
+ rd_free(data_points[i]);
594
+ rd_free(metric_names[i]);
595
+ rd_free(metrics[i]);
596
+ }
597
+ rd_free(data_points);
598
+ rd_free(metric_names);
599
+ rd_free(metrics);
600
+ rd_free(datapoint_attributes_key_values);
601
+ }
602
+
603
+ static void free_resource_attributes(
604
+ opentelemetry_proto_common_v1_KeyValue **resource_attributes_key_values,
605
+ rd_kafka_telemetry_resource_attribute_t *resource_attributes_struct,
606
+ size_t count) {
607
+ size_t i;
608
+ if (count == 0)
609
+ return;
610
+ for (i = 0; i < count; i++)
611
+ rd_free(resource_attributes_key_values[i]);
612
+ rd_free(resource_attributes_struct);
613
+ rd_free(resource_attributes_key_values);
614
+ }
615
+
616
+ static void serialize_Metric(
617
+ rd_kafka_t *rk,
618
+ rd_kafka_broker_t *rkb,
619
+ const rd_kafka_telemetry_metric_info_t *info,
620
+ opentelemetry_proto_metrics_v1_Metric **metric,
621
+ opentelemetry_proto_metrics_v1_NumberDataPoint **data_point,
622
+ opentelemetry_proto_common_v1_KeyValue *data_point_attribute,
623
+ rd_kafka_telemetry_metric_value_calculator_t metric_value_calculator,
624
+ char **metric_name,
625
+ bool is_per_broker,
626
+ rd_ts_t now_ns) {
627
+ rd_ts_t ts_last = rk->rk_telemetry.rk_historic_c.ts_last,
628
+ ts_start = rk->rk_telemetry.rk_historic_c.ts_start;
629
+ size_t metric_name_len;
630
+ if (info->is_int) {
631
+ (*data_point)->which_value =
632
+ opentelemetry_proto_metrics_v1_NumberDataPoint_as_int_tag;
633
+ (*data_point)->value.as_int =
634
+ metric_value_calculator(rk, rkb, now_ns).int_value;
635
+ } else {
636
+ (*data_point)->which_value =
637
+ opentelemetry_proto_metrics_v1_NumberDataPoint_as_double_tag;
638
+ (*data_point)->value.as_double =
639
+ metric_value_calculator(rk, rkb, now_ns).double_value;
640
+ }
641
+
642
+
643
+ (*data_point)->time_unix_nano = now_ns;
644
+ if (info->type == RD_KAFKA_TELEMETRY_METRIC_TYPE_GAUGE ||
645
+ (info->type == RD_KAFKA_TELEMETRY_METRIC_TYPE_SUM &&
646
+ rk->rk_telemetry.delta_temporality))
647
+ (*data_point)->start_time_unix_nano = ts_last;
648
+ else
649
+ (*data_point)->start_time_unix_nano = ts_start;
650
+
651
+ if (is_per_broker) {
652
+ data_point_attribute->key.funcs.encode = &encode_string;
653
+ data_point_attribute->key.arg =
654
+ RD_KAFKA_TELEMETRY_METRIC_NODE_ID_ATTRIBUTE;
655
+ data_point_attribute->has_value = true;
656
+ data_point_attribute->value.which_value =
657
+ opentelemetry_proto_common_v1_AnyValue_int_value_tag;
658
+
659
+ rd_kafka_broker_lock(rkb);
660
+ data_point_attribute->value.value.int_value = rkb->rkb_nodeid;
661
+ rd_kafka_broker_unlock(rkb);
662
+
663
+ (*data_point)->attributes.funcs.encode = &encode_key_value;
664
+ (*data_point)->attributes.arg = data_point_attribute;
665
+ }
666
+
667
+
668
+ switch (info->type) {
669
+
670
+ case RD_KAFKA_TELEMETRY_METRIC_TYPE_SUM: {
671
+ (*metric)->which_data =
672
+ opentelemetry_proto_metrics_v1_Metric_sum_tag;
673
+ (*metric)->data.sum.data_points.funcs.encode =
674
+ &encode_number_data_point;
675
+ (*metric)->data.sum.data_points.arg = *data_point;
676
+ (*metric)->data.sum.aggregation_temporality =
677
+ rk->rk_telemetry.delta_temporality
678
+ ? opentelemetry_proto_metrics_v1_AggregationTemporality_AGGREGATION_TEMPORALITY_DELTA
679
+ : opentelemetry_proto_metrics_v1_AggregationTemporality_AGGREGATION_TEMPORALITY_CUMULATIVE;
680
+ (*metric)->data.sum.is_monotonic = true;
681
+ break;
682
+ }
683
+ case RD_KAFKA_TELEMETRY_METRIC_TYPE_GAUGE: {
684
+ (*metric)->which_data =
685
+ opentelemetry_proto_metrics_v1_Metric_gauge_tag;
686
+ (*metric)->data.gauge.data_points.funcs.encode =
687
+ &encode_number_data_point;
688
+ (*metric)->data.gauge.data_points.arg = *data_point;
689
+ break;
690
+ }
691
+ default:
692
+ rd_assert(!"Unknown metric type");
693
+ break;
694
+ }
695
+
696
+ (*metric)->description.funcs.encode = &encode_string;
697
+ (*metric)->description.arg = (void *)info->description;
698
+
699
+ metric_name_len =
700
+ strlen(RD_KAFKA_TELEMETRY_METRIC_PREFIX) + strlen(info->name) + 1;
701
+ *metric_name = rd_calloc(1, metric_name_len);
702
+ rd_snprintf(*metric_name, metric_name_len, "%s%s",
703
+ RD_KAFKA_TELEMETRY_METRIC_PREFIX, info->name);
704
+
705
+
706
+ (*metric)->name.funcs.encode = &encode_string;
707
+ (*metric)->name.arg = *metric_name;
708
+
709
+ /* Skipping unit as Java client does the same */
710
+ }
711
+
712
+ /**
713
+ * @brief Encodes the metrics to opentelemetry_proto_metrics_v1_MetricsData and
714
+ * returns the serialized data. Currently only supports encoding of connection
715
+ * creation total by default
716
+ *
717
+ * @locks none
718
+ * @locks_acquired rd_kafka_rdlock()
719
+ * @locality main thread
720
+ */
721
+ rd_buf_t *rd_kafka_telemetry_encode_metrics(rd_kafka_t *rk) {
722
+ rd_buf_t *rbuf = NULL;
723
+ rd_kafka_broker_t *rkb;
724
+ size_t message_size;
725
+ void *buffer = NULL;
726
+ pb_ostream_t stream;
727
+ bool status;
728
+ char **metric_names;
729
+ const int *metrics_to_encode = rk->rk_telemetry.matched_metrics;
730
+ const size_t metrics_to_encode_count =
731
+ rk->rk_telemetry.matched_metrics_cnt;
732
+ const rd_kafka_telemetry_metric_info_t *info =
733
+ RD_KAFKA_TELEMETRY_METRIC_INFO(rk);
734
+ size_t total_metrics_count = metrics_to_encode_count;
735
+ size_t i, metric_idx = 0;
736
+
737
+ if (!metrics_to_encode_count)
738
+ return rd_buf_new(1, 1);
739
+
740
+ opentelemetry_proto_metrics_v1_MetricsData metrics_data =
741
+ opentelemetry_proto_metrics_v1_MetricsData_init_zero;
742
+
743
+ opentelemetry_proto_metrics_v1_ResourceMetrics resource_metrics =
744
+ opentelemetry_proto_metrics_v1_ResourceMetrics_init_zero;
745
+
746
+ opentelemetry_proto_metrics_v1_Metric **metrics;
747
+ opentelemetry_proto_common_v1_KeyValue *
748
+ *resource_attributes_key_values = NULL;
749
+ opentelemetry_proto_common_v1_KeyValue
750
+ *datapoint_attributes_key_values = NULL;
751
+ opentelemetry_proto_metrics_v1_NumberDataPoint **data_points;
752
+ rd_kafka_telemetry_metrics_repeated_t metrics_repeated;
753
+ rd_kafka_telemetry_key_values_repeated_t resource_attributes_repeated;
754
+ rd_kafka_telemetry_resource_attribute_t *resource_attributes_struct =
755
+ NULL;
756
+ rd_ts_t now_ns = rd_uclock() * 1000;
757
+ rd_kafka_rdlock(rk);
758
+
759
+ for (i = 0; i < metrics_to_encode_count; i++) {
760
+ if (info[metrics_to_encode[i]].is_per_broker) {
761
+ total_metrics_count += rk->rk_broker_cnt.val - 1;
762
+ }
763
+ }
764
+
765
+ rd_kafka_dbg(rk, TELEMETRY, "PUSH", "Serializing metrics");
766
+
767
+ TAILQ_FOREACH(rkb, &rk->rk_brokers, rkb_link) {
768
+ rd_avg_destroy(&rkb->rkb_telemetry.rd_avg_rollover.rkb_avg_rtt);
769
+ rd_avg_rollover(&rkb->rkb_telemetry.rd_avg_rollover.rkb_avg_rtt,
770
+ &rkb->rkb_telemetry.rd_avg_current.rkb_avg_rtt);
771
+ rd_avg_destroy(
772
+ &rkb->rkb_telemetry.rd_avg_rollover.rkb_avg_outbuf_latency);
773
+ rd_avg_rollover(
774
+ &rkb->rkb_telemetry.rd_avg_rollover.rkb_avg_outbuf_latency,
775
+ &rkb->rkb_telemetry.rd_avg_current.rkb_avg_outbuf_latency);
776
+ rd_avg_destroy(
777
+ &rkb->rkb_telemetry.rd_avg_rollover.rkb_avg_throttle);
778
+ rd_avg_rollover(
779
+ &rkb->rkb_telemetry.rd_avg_rollover.rkb_avg_throttle,
780
+ &rkb->rkb_telemetry.rd_avg_current.rkb_avg_throttle);
781
+ if (rk->rk_type == RD_KAFKA_CONSUMER) {
782
+ rd_avg_destroy(&rkb->rkb_telemetry.rd_avg_rollover
783
+ .rkb_avg_fetch_latency);
784
+ rd_avg_rollover(&rkb->rkb_telemetry.rd_avg_rollover
785
+ .rkb_avg_fetch_latency,
786
+ &rkb->rkb_telemetry.rd_avg_current
787
+ .rkb_avg_fetch_latency);
788
+ } else if (rk->rk_type == RD_KAFKA_PRODUCER) {
789
+ rd_avg_destroy(&rkb->rkb_telemetry.rd_avg_rollover
790
+ .rkb_avg_produce_latency);
791
+ rd_avg_rollover(&rkb->rkb_telemetry.rd_avg_rollover
792
+ .rkb_avg_produce_latency,
793
+ &rkb->rkb_telemetry.rd_avg_current
794
+ .rkb_avg_produce_latency);
795
+ }
796
+ }
797
+
798
+ if (rk->rk_type == RD_KAFKA_CONSUMER) {
799
+ rd_avg_destroy(
800
+ &rk->rk_telemetry.rd_avg_rollover.rk_avg_poll_idle_ratio);
801
+ rd_avg_rollover(
802
+ &rk->rk_telemetry.rd_avg_rollover.rk_avg_poll_idle_ratio,
803
+ &rk->rk_telemetry.rd_avg_current.rk_avg_poll_idle_ratio);
804
+
805
+ rd_avg_destroy(
806
+ &rk->rk_telemetry.rd_avg_rollover.rk_avg_rebalance_latency);
807
+ rd_avg_rollover(
808
+ &rk->rk_telemetry.rd_avg_rollover.rk_avg_rebalance_latency,
809
+ &rk->rk_telemetry.rd_avg_current.rk_avg_rebalance_latency);
810
+
811
+ rd_avg_destroy(
812
+ &rk->rk_telemetry.rd_avg_rollover.rk_avg_commit_latency);
813
+ rd_avg_rollover(
814
+ &rk->rk_telemetry.rd_avg_rollover.rk_avg_commit_latency,
815
+ &rk->rk_telemetry.rd_avg_current.rk_avg_commit_latency);
816
+ }
817
+
818
+ int resource_attributes_count =
819
+ resource_attributes(rk, &resource_attributes_struct);
820
+ rd_kafka_dbg(rk, TELEMETRY, "PUSH", "Resource attributes count: %d",
821
+ resource_attributes_count);
822
+ if (resource_attributes_count > 0) {
823
+ resource_attributes_key_values =
824
+ rd_malloc(sizeof(opentelemetry_proto_common_v1_KeyValue *) *
825
+ resource_attributes_count);
826
+ int ind;
827
+ for (ind = 0; ind < resource_attributes_count; ++ind) {
828
+ resource_attributes_key_values[ind] = rd_calloc(
829
+ 1, sizeof(opentelemetry_proto_common_v1_KeyValue));
830
+ resource_attributes_key_values[ind]->key.funcs.encode =
831
+ &encode_string;
832
+ resource_attributes_key_values[ind]->key.arg =
833
+ (void *)resource_attributes_struct[ind].name;
834
+
835
+ resource_attributes_key_values[ind]->has_value = true;
836
+ resource_attributes_key_values[ind]->value.which_value =
837
+ opentelemetry_proto_common_v1_AnyValue_string_value_tag;
838
+ resource_attributes_key_values[ind]
839
+ ->value.value.string_value.funcs.encode =
840
+ &encode_string;
841
+ resource_attributes_key_values[ind]
842
+ ->value.value.string_value.arg =
843
+ (void *)resource_attributes_struct[ind].value;
844
+ }
845
+ resource_attributes_repeated.key_values =
846
+ resource_attributes_key_values;
847
+ resource_attributes_repeated.count = resource_attributes_count;
848
+ resource_metrics.has_resource = true;
849
+ resource_metrics.resource.attributes.funcs.encode =
850
+ &encode_key_values;
851
+ resource_metrics.resource.attributes.arg =
852
+ &resource_attributes_repeated;
853
+ }
854
+
855
+ opentelemetry_proto_metrics_v1_ScopeMetrics scope_metrics =
856
+ opentelemetry_proto_metrics_v1_ScopeMetrics_init_zero;
857
+
858
+ opentelemetry_proto_common_v1_InstrumentationScope
859
+ instrumentation_scope =
860
+ opentelemetry_proto_common_v1_InstrumentationScope_init_zero;
861
+ instrumentation_scope.name.funcs.encode = &encode_string;
862
+ instrumentation_scope.name.arg = (void *)rd_kafka_name(rk);
863
+ instrumentation_scope.version.funcs.encode = &encode_string;
864
+ instrumentation_scope.version.arg = (void *)rd_kafka_version_str();
865
+
866
+ scope_metrics.has_scope = true;
867
+ scope_metrics.scope = instrumentation_scope;
868
+
869
+ metrics = rd_malloc(sizeof(opentelemetry_proto_metrics_v1_Metric *) *
870
+ total_metrics_count);
871
+ data_points =
872
+ rd_malloc(sizeof(opentelemetry_proto_metrics_v1_NumberDataPoint *) *
873
+ total_metrics_count);
874
+ datapoint_attributes_key_values =
875
+ rd_malloc(sizeof(opentelemetry_proto_common_v1_KeyValue) *
876
+ total_metrics_count);
877
+ metric_names = rd_malloc(sizeof(char *) * total_metrics_count);
878
+ rd_kafka_dbg(rk, TELEMETRY, "PUSH",
879
+ "Total metrics to be encoded count: %" PRIusz,
880
+ total_metrics_count);
881
+
882
+
883
+ for (i = 0; i < metrics_to_encode_count; i++) {
884
+
885
+ rd_kafka_telemetry_metric_value_calculator_t
886
+ metric_value_calculator =
887
+ (rk->rk_type == RD_KAFKA_PRODUCER)
888
+ ? PRODUCER_METRIC_VALUE_CALCULATORS
889
+ [metrics_to_encode[i]]
890
+ : CONSUMER_METRIC_VALUE_CALCULATORS
891
+ [metrics_to_encode[i]];
892
+ if (info[metrics_to_encode[i]].is_per_broker) {
893
+ rd_kafka_broker_t *rkb;
894
+
895
+ TAILQ_FOREACH(rkb, &rk->rk_brokers, rkb_link) {
896
+ metrics[metric_idx] = rd_calloc(
897
+ 1,
898
+ sizeof(
899
+ opentelemetry_proto_metrics_v1_Metric));
900
+ data_points[metric_idx] = rd_calloc(
901
+ 1,
902
+ sizeof(
903
+ opentelemetry_proto_metrics_v1_NumberDataPoint));
904
+ serialize_Metric(
905
+ rk, rkb, &info[metrics_to_encode[i]],
906
+ &metrics[metric_idx],
907
+ &data_points[metric_idx],
908
+ &datapoint_attributes_key_values
909
+ [metric_idx],
910
+ metric_value_calculator,
911
+ &metric_names[metric_idx], true, now_ns);
912
+ metric_idx++;
913
+ }
914
+ continue;
915
+ }
916
+
917
+ metrics[metric_idx] =
918
+ rd_calloc(1, sizeof(opentelemetry_proto_metrics_v1_Metric));
919
+ data_points[metric_idx] = rd_calloc(
920
+ 1, sizeof(opentelemetry_proto_metrics_v1_NumberDataPoint));
921
+
922
+ serialize_Metric(rk, NULL, &info[metrics_to_encode[i]],
923
+ &metrics[metric_idx], &data_points[metric_idx],
924
+ &datapoint_attributes_key_values[metric_idx],
925
+ metric_value_calculator,
926
+ &metric_names[metric_idx], false, now_ns);
927
+ metric_idx++;
928
+ }
929
+
930
+ /* Send empty metrics blob if no metrics are matched */
931
+ if (total_metrics_count > 0) {
932
+ metrics_repeated.metrics = metrics;
933
+ metrics_repeated.count = total_metrics_count;
934
+
935
+ scope_metrics.metrics.funcs.encode = &encode_metric;
936
+ scope_metrics.metrics.arg = &metrics_repeated;
937
+
938
+
939
+ resource_metrics.scope_metrics.funcs.encode =
940
+ &encode_scope_metrics;
941
+ resource_metrics.scope_metrics.arg = &scope_metrics;
942
+
943
+ metrics_data.resource_metrics.funcs.encode =
944
+ &encode_resource_metrics;
945
+ metrics_data.resource_metrics.arg = &resource_metrics;
946
+ }
947
+
948
+ status = pb_get_encoded_size(
949
+ &message_size, opentelemetry_proto_metrics_v1_MetricsData_fields,
950
+ &metrics_data);
951
+ if (!status) {
952
+ rd_kafka_dbg(rk, TELEMETRY, "PUSH",
953
+ "Failed to get encoded size");
954
+ goto fail;
955
+ }
956
+
957
+ rbuf = rd_buf_new(1, message_size);
958
+ rd_buf_write_ensure(rbuf, message_size, message_size);
959
+ message_size = rd_buf_get_writable(rbuf, &buffer);
960
+
961
+ stream = pb_ostream_from_buffer(buffer, message_size);
962
+ status = pb_encode(&stream,
963
+ opentelemetry_proto_metrics_v1_MetricsData_fields,
964
+ &metrics_data);
965
+
966
+ if (!status) {
967
+ rd_kafka_dbg(rk, TELEMETRY, "PUSH", "Encoding failed: %s",
968
+ PB_GET_ERROR(&stream));
969
+ rd_buf_destroy_free(rbuf);
970
+ goto fail;
971
+ }
972
+ rd_kafka_dbg(rk, TELEMETRY, "PUSH",
973
+ "Push Telemetry metrics encoded, size: %" PRIusz,
974
+ stream.bytes_written);
975
+ rd_buf_write(rbuf, NULL, stream.bytes_written);
976
+
977
+ reset_historical_metrics(rk, now_ns);
978
+
979
+ free_metrics(metrics, metric_names, data_points,
980
+ datapoint_attributes_key_values, total_metrics_count);
981
+ free_resource_attributes(resource_attributes_key_values,
982
+ resource_attributes_struct,
983
+ resource_attributes_count);
984
+ rd_kafka_rdunlock(rk);
985
+
986
+ return rbuf;
987
+
988
+ fail:
989
+ free_metrics(metrics, metric_names, data_points,
990
+ datapoint_attributes_key_values, total_metrics_count);
991
+ free_resource_attributes(resource_attributes_key_values,
992
+ resource_attributes_struct,
993
+ resource_attributes_count);
994
+ rd_kafka_rdunlock(rk);
995
+
996
+ return NULL;
997
+ }