@ohos-ports/confluentinc-kafka-javascript 1.10.0-beta.1

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 (628) hide show
  1. package/CHANGELOG.md +457 -0
  2. package/LICENSE.kafkajs +31 -0
  3. package/LICENSE.node-rdkafka +25 -0
  4. package/LICENSE.txt +20 -0
  5. package/README.md +133 -0
  6. package/binding.gyp +184 -0
  7. package/build/Release/confluent-kafka-javascript.node +0 -0
  8. package/build/deps/librdkafka++.so.1 +0 -0
  9. package/build/deps/librdkafka.Makefile +6 -0
  10. package/build/deps/librdkafka.so.1 +0 -0
  11. package/build/deps/librdkafka.target.mk +55 -0
  12. package/deps/librdkafka/.clang-format +136 -0
  13. package/deps/librdkafka/.clang-format-cpp +103 -0
  14. package/deps/librdkafka/.dir-locals.el +10 -0
  15. package/deps/librdkafka/.formatignore +35 -0
  16. package/deps/librdkafka/.gdbmacros +19 -0
  17. package/deps/librdkafka/CHANGELOG.md +2477 -0
  18. package/deps/librdkafka/CMakeLists.txt +291 -0
  19. package/deps/librdkafka/CODE_OF_CONDUCT.md +46 -0
  20. package/deps/librdkafka/CONFIGURATION.md +212 -0
  21. package/deps/librdkafka/CONTRIBUTING.md +431 -0
  22. package/deps/librdkafka/Doxyfile +2375 -0
  23. package/deps/librdkafka/INTRODUCTION.md +2752 -0
  24. package/deps/librdkafka/LICENSE +26 -0
  25. package/deps/librdkafka/LICENSE.cjson +22 -0
  26. package/deps/librdkafka/LICENSE.crc32c +28 -0
  27. package/deps/librdkafka/LICENSE.fnv1a +18 -0
  28. package/deps/librdkafka/LICENSE.hdrhistogram +27 -0
  29. package/deps/librdkafka/LICENSE.lz4 +26 -0
  30. package/deps/librdkafka/LICENSE.murmur2 +25 -0
  31. package/deps/librdkafka/LICENSE.nanopb +22 -0
  32. package/deps/librdkafka/LICENSE.opentelemetry +203 -0
  33. package/deps/librdkafka/LICENSE.pycrc +23 -0
  34. package/deps/librdkafka/LICENSE.queue +31 -0
  35. package/deps/librdkafka/LICENSE.regexp +5 -0
  36. package/deps/librdkafka/LICENSE.snappy +36 -0
  37. package/deps/librdkafka/LICENSE.tinycthread +26 -0
  38. package/deps/librdkafka/LICENSE.wingetopt +49 -0
  39. package/deps/librdkafka/LICENSES.txt +625 -0
  40. package/deps/librdkafka/Makefile +125 -0
  41. package/deps/librdkafka/README.md +201 -0
  42. package/deps/librdkafka/README.win32 +26 -0
  43. package/deps/librdkafka/STATISTICS.md +624 -0
  44. package/deps/librdkafka/configure +214 -0
  45. package/deps/librdkafka/configure.self +341 -0
  46. package/deps/librdkafka/dev-conf.sh +123 -0
  47. package/deps/librdkafka/lds-gen.py +73 -0
  48. package/deps/librdkafka/mainpage.doxy +40 -0
  49. package/deps/librdkafka/mklove/Makefile.base +329 -0
  50. package/deps/librdkafka/mklove/modules/configure.atomics +144 -0
  51. package/deps/librdkafka/mklove/modules/configure.base +2484 -0
  52. package/deps/librdkafka/mklove/modules/configure.builtin +70 -0
  53. package/deps/librdkafka/mklove/modules/configure.cc +186 -0
  54. package/deps/librdkafka/mklove/modules/configure.cxx +8 -0
  55. package/deps/librdkafka/mklove/modules/configure.fileversion +65 -0
  56. package/deps/librdkafka/mklove/modules/configure.gitversion +29 -0
  57. package/deps/librdkafka/mklove/modules/configure.good_cflags +18 -0
  58. package/deps/librdkafka/mklove/modules/configure.host +132 -0
  59. package/deps/librdkafka/mklove/modules/configure.lib +49 -0
  60. package/deps/librdkafka/mklove/modules/configure.libcurl +99 -0
  61. package/deps/librdkafka/mklove/modules/configure.libsasl2 +36 -0
  62. package/deps/librdkafka/mklove/modules/configure.libssl +147 -0
  63. package/deps/librdkafka/mklove/modules/configure.libzstd +58 -0
  64. package/deps/librdkafka/mklove/modules/configure.parseversion +95 -0
  65. package/deps/librdkafka/mklove/modules/configure.pic +16 -0
  66. package/deps/librdkafka/mklove/modules/configure.socket +20 -0
  67. package/deps/librdkafka/mklove/modules/configure.zlib +61 -0
  68. package/deps/librdkafka/mklove/modules/patches/README.md +8 -0
  69. package/deps/librdkafka/mklove/modules/patches/libcurl.0000-no-runtime-linking-check.patch +11 -0
  70. package/deps/librdkafka/mklove/modules/patches/libssl.0000-osx-rand-include-fix-OpenSSL-PR16409.patch +56 -0
  71. package/deps/librdkafka/service.yml +182 -0
  72. package/deps/librdkafka/src/CMakeLists.txt +379 -0
  73. package/deps/librdkafka/src/Makefile +105 -0
  74. package/deps/librdkafka/src/README.lz4.md +30 -0
  75. package/deps/librdkafka/src/cJSON.c +3191 -0
  76. package/deps/librdkafka/src/cJSON.h +306 -0
  77. package/deps/librdkafka/src/crc32c.c +430 -0
  78. package/deps/librdkafka/src/crc32c.h +38 -0
  79. package/deps/librdkafka/src/generate_proto.sh +66 -0
  80. package/deps/librdkafka/src/librdkafka_cgrp_synch.png +0 -0
  81. package/deps/librdkafka/src/lz4.c +2727 -0
  82. package/deps/librdkafka/src/lz4.h +842 -0
  83. package/deps/librdkafka/src/lz4frame.c +2078 -0
  84. package/deps/librdkafka/src/lz4frame.h +692 -0
  85. package/deps/librdkafka/src/lz4frame_static.h +47 -0
  86. package/deps/librdkafka/src/lz4hc.c +1631 -0
  87. package/deps/librdkafka/src/lz4hc.h +413 -0
  88. package/deps/librdkafka/src/nanopb/pb.h +917 -0
  89. package/deps/librdkafka/src/nanopb/pb_common.c +388 -0
  90. package/deps/librdkafka/src/nanopb/pb_common.h +49 -0
  91. package/deps/librdkafka/src/nanopb/pb_decode.c +1727 -0
  92. package/deps/librdkafka/src/nanopb/pb_decode.h +193 -0
  93. package/deps/librdkafka/src/nanopb/pb_encode.c +1000 -0
  94. package/deps/librdkafka/src/nanopb/pb_encode.h +185 -0
  95. package/deps/librdkafka/src/opentelemetry/common.pb.c +32 -0
  96. package/deps/librdkafka/src/opentelemetry/common.pb.h +170 -0
  97. package/deps/librdkafka/src/opentelemetry/metrics.options +2 -0
  98. package/deps/librdkafka/src/opentelemetry/metrics.pb.c +67 -0
  99. package/deps/librdkafka/src/opentelemetry/metrics.pb.h +966 -0
  100. package/deps/librdkafka/src/opentelemetry/resource.pb.c +12 -0
  101. package/deps/librdkafka/src/opentelemetry/resource.pb.h +58 -0
  102. package/deps/librdkafka/src/queue.h +850 -0
  103. package/deps/librdkafka/src/rd.h +592 -0
  104. package/deps/librdkafka/src/rdaddr.c +255 -0
  105. package/deps/librdkafka/src/rdaddr.h +202 -0
  106. package/deps/librdkafka/src/rdatomic.h +262 -0
  107. package/deps/librdkafka/src/rdavg.h +260 -0
  108. package/deps/librdkafka/src/rdavl.c +210 -0
  109. package/deps/librdkafka/src/rdavl.h +250 -0
  110. package/deps/librdkafka/src/rdbase64.c +200 -0
  111. package/deps/librdkafka/src/rdbase64.h +43 -0
  112. package/deps/librdkafka/src/rdbuf.c +1884 -0
  113. package/deps/librdkafka/src/rdbuf.h +375 -0
  114. package/deps/librdkafka/src/rdcrc32.c +114 -0
  115. package/deps/librdkafka/src/rdcrc32.h +170 -0
  116. package/deps/librdkafka/src/rddl.c +179 -0
  117. package/deps/librdkafka/src/rddl.h +43 -0
  118. package/deps/librdkafka/src/rdendian.h +175 -0
  119. package/deps/librdkafka/src/rdfloat.h +67 -0
  120. package/deps/librdkafka/src/rdfnv1a.c +113 -0
  121. package/deps/librdkafka/src/rdfnv1a.h +35 -0
  122. package/deps/librdkafka/src/rdgz.c +120 -0
  123. package/deps/librdkafka/src/rdgz.h +46 -0
  124. package/deps/librdkafka/src/rdhdrhistogram.c +721 -0
  125. package/deps/librdkafka/src/rdhdrhistogram.h +87 -0
  126. package/deps/librdkafka/src/rdhttp.c +831 -0
  127. package/deps/librdkafka/src/rdhttp.h +101 -0
  128. package/deps/librdkafka/src/rdinterval.h +177 -0
  129. package/deps/librdkafka/src/rdkafka.c +7287 -0
  130. package/deps/librdkafka/src/rdkafka.h +11795 -0
  131. package/deps/librdkafka/src/rdkafka_admin.c +10165 -0
  132. package/deps/librdkafka/src/rdkafka_admin.h +658 -0
  133. package/deps/librdkafka/src/rdkafka_assignment.c +1282 -0
  134. package/deps/librdkafka/src/rdkafka_assignment.h +73 -0
  135. package/deps/librdkafka/src/rdkafka_assignor.c +1800 -0
  136. package/deps/librdkafka/src/rdkafka_assignor.h +402 -0
  137. package/deps/librdkafka/src/rdkafka_aux.c +409 -0
  138. package/deps/librdkafka/src/rdkafka_aux.h +174 -0
  139. package/deps/librdkafka/src/rdkafka_background.c +222 -0
  140. package/deps/librdkafka/src/rdkafka_broker.c +6736 -0
  141. package/deps/librdkafka/src/rdkafka_broker.h +851 -0
  142. package/deps/librdkafka/src/rdkafka_buf.c +543 -0
  143. package/deps/librdkafka/src/rdkafka_buf.h +1525 -0
  144. package/deps/librdkafka/src/rdkafka_cert.c +576 -0
  145. package/deps/librdkafka/src/rdkafka_cert.h +62 -0
  146. package/deps/librdkafka/src/rdkafka_cgrp.c +8310 -0
  147. package/deps/librdkafka/src/rdkafka_cgrp.h +589 -0
  148. package/deps/librdkafka/src/rdkafka_conf.c +5177 -0
  149. package/deps/librdkafka/src/rdkafka_conf.h +746 -0
  150. package/deps/librdkafka/src/rdkafka_confval.h +97 -0
  151. package/deps/librdkafka/src/rdkafka_coord.c +623 -0
  152. package/deps/librdkafka/src/rdkafka_coord.h +132 -0
  153. package/deps/librdkafka/src/rdkafka_error.c +228 -0
  154. package/deps/librdkafka/src/rdkafka_error.h +80 -0
  155. package/deps/librdkafka/src/rdkafka_event.c +502 -0
  156. package/deps/librdkafka/src/rdkafka_event.h +126 -0
  157. package/deps/librdkafka/src/rdkafka_feature.c +898 -0
  158. package/deps/librdkafka/src/rdkafka_feature.h +104 -0
  159. package/deps/librdkafka/src/rdkafka_fetcher.c +3820 -0
  160. package/deps/librdkafka/src/rdkafka_fetcher.h +62 -0
  161. package/deps/librdkafka/src/rdkafka_header.c +220 -0
  162. package/deps/librdkafka/src/rdkafka_header.h +76 -0
  163. package/deps/librdkafka/src/rdkafka_idempotence.c +807 -0
  164. package/deps/librdkafka/src/rdkafka_idempotence.h +144 -0
  165. package/deps/librdkafka/src/rdkafka_int.h +1505 -0
  166. package/deps/librdkafka/src/rdkafka_interceptor.c +842 -0
  167. package/deps/librdkafka/src/rdkafka_interceptor.h +104 -0
  168. package/deps/librdkafka/src/rdkafka_lz4.c +450 -0
  169. package/deps/librdkafka/src/rdkafka_lz4.h +49 -0
  170. package/deps/librdkafka/src/rdkafka_metadata.c +2347 -0
  171. package/deps/librdkafka/src/rdkafka_metadata.h +350 -0
  172. package/deps/librdkafka/src/rdkafka_metadata_cache.c +1183 -0
  173. package/deps/librdkafka/src/rdkafka_mock.c +4514 -0
  174. package/deps/librdkafka/src/rdkafka_mock.h +867 -0
  175. package/deps/librdkafka/src/rdkafka_mock_cgrp.c +1877 -0
  176. package/deps/librdkafka/src/rdkafka_mock_handlers.c +5255 -0
  177. package/deps/librdkafka/src/rdkafka_mock_int.h +1005 -0
  178. package/deps/librdkafka/src/rdkafka_mock_sharegrp.c +1207 -0
  179. package/deps/librdkafka/src/rdkafka_msg.c +2619 -0
  180. package/deps/librdkafka/src/rdkafka_msg.h +629 -0
  181. package/deps/librdkafka/src/rdkafka_msgbatch.h +62 -0
  182. package/deps/librdkafka/src/rdkafka_msgset.h +105 -0
  183. package/deps/librdkafka/src/rdkafka_msgset_reader.c +2099 -0
  184. package/deps/librdkafka/src/rdkafka_msgset_writer.c +1474 -0
  185. package/deps/librdkafka/src/rdkafka_offset.c +1565 -0
  186. package/deps/librdkafka/src/rdkafka_offset.h +150 -0
  187. package/deps/librdkafka/src/rdkafka_op.c +1219 -0
  188. package/deps/librdkafka/src/rdkafka_op.h +1065 -0
  189. package/deps/librdkafka/src/rdkafka_partition.c +5109 -0
  190. package/deps/librdkafka/src/rdkafka_partition.h +1215 -0
  191. package/deps/librdkafka/src/rdkafka_pattern.c +228 -0
  192. package/deps/librdkafka/src/rdkafka_pattern.h +70 -0
  193. package/deps/librdkafka/src/rdkafka_plugin.c +213 -0
  194. package/deps/librdkafka/src/rdkafka_plugin.h +41 -0
  195. package/deps/librdkafka/src/rdkafka_proto.h +739 -0
  196. package/deps/librdkafka/src/rdkafka_protocol.h +131 -0
  197. package/deps/librdkafka/src/rdkafka_queue.c +1351 -0
  198. package/deps/librdkafka/src/rdkafka_queue.h +1235 -0
  199. package/deps/librdkafka/src/rdkafka_range_assignor.c +1748 -0
  200. package/deps/librdkafka/src/rdkafka_request.c +7298 -0
  201. package/deps/librdkafka/src/rdkafka_request.h +761 -0
  202. package/deps/librdkafka/src/rdkafka_roundrobin_assignor.c +123 -0
  203. package/deps/librdkafka/src/rdkafka_sasl.c +589 -0
  204. package/deps/librdkafka/src/rdkafka_sasl.h +63 -0
  205. package/deps/librdkafka/src/rdkafka_sasl_cyrus.c +722 -0
  206. package/deps/librdkafka/src/rdkafka_sasl_int.h +89 -0
  207. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer.c +1833 -0
  208. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer.h +52 -0
  209. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer_oidc.c +1827 -0
  210. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer_oidc.h +52 -0
  211. package/deps/librdkafka/src/rdkafka_sasl_plain.c +142 -0
  212. package/deps/librdkafka/src/rdkafka_sasl_scram.c +858 -0
  213. package/deps/librdkafka/src/rdkafka_sasl_win32.c +550 -0
  214. package/deps/librdkafka/src/rdkafka_share_acknowledgement.c +1445 -0
  215. package/deps/librdkafka/src/rdkafka_share_acknowledgement.h +373 -0
  216. package/deps/librdkafka/src/rdkafka_ssl.c +2235 -0
  217. package/deps/librdkafka/src/rdkafka_ssl.h +86 -0
  218. package/deps/librdkafka/src/rdkafka_sticky_assignor.c +4785 -0
  219. package/deps/librdkafka/src/rdkafka_subscription.c +411 -0
  220. package/deps/librdkafka/src/rdkafka_telemetry.c +761 -0
  221. package/deps/librdkafka/src/rdkafka_telemetry.h +52 -0
  222. package/deps/librdkafka/src/rdkafka_telemetry_decode.c +1307 -0
  223. package/deps/librdkafka/src/rdkafka_telemetry_decode.h +59 -0
  224. package/deps/librdkafka/src/rdkafka_telemetry_encode.c +1309 -0
  225. package/deps/librdkafka/src/rdkafka_telemetry_encode.h +459 -0
  226. package/deps/librdkafka/src/rdkafka_timer.c +407 -0
  227. package/deps/librdkafka/src/rdkafka_timer.h +117 -0
  228. package/deps/librdkafka/src/rdkafka_topic.c +2382 -0
  229. package/deps/librdkafka/src/rdkafka_topic.h +369 -0
  230. package/deps/librdkafka/src/rdkafka_transport.c +1309 -0
  231. package/deps/librdkafka/src/rdkafka_transport.h +99 -0
  232. package/deps/librdkafka/src/rdkafka_transport_int.h +100 -0
  233. package/deps/librdkafka/src/rdkafka_txnmgr.c +3256 -0
  234. package/deps/librdkafka/src/rdkafka_txnmgr.h +171 -0
  235. package/deps/librdkafka/src/rdkafka_zstd.c +226 -0
  236. package/deps/librdkafka/src/rdkafka_zstd.h +57 -0
  237. package/deps/librdkafka/src/rdlist.c +593 -0
  238. package/deps/librdkafka/src/rdlist.h +444 -0
  239. package/deps/librdkafka/src/rdlog.c +89 -0
  240. package/deps/librdkafka/src/rdlog.h +41 -0
  241. package/deps/librdkafka/src/rdmap.c +508 -0
  242. package/deps/librdkafka/src/rdmap.h +492 -0
  243. package/deps/librdkafka/src/rdmurmur2.c +167 -0
  244. package/deps/librdkafka/src/rdmurmur2.h +35 -0
  245. package/deps/librdkafka/src/rdports.c +61 -0
  246. package/deps/librdkafka/src/rdports.h +38 -0
  247. package/deps/librdkafka/src/rdposix.h +250 -0
  248. package/deps/librdkafka/src/rdrand.c +151 -0
  249. package/deps/librdkafka/src/rdrand.h +72 -0
  250. package/deps/librdkafka/src/rdregex.c +156 -0
  251. package/deps/librdkafka/src/rdregex.h +43 -0
  252. package/deps/librdkafka/src/rdsignal.h +57 -0
  253. package/deps/librdkafka/src/rdstring.c +645 -0
  254. package/deps/librdkafka/src/rdstring.h +98 -0
  255. package/deps/librdkafka/src/rdsysqueue.h +404 -0
  256. package/deps/librdkafka/src/rdtime.h +356 -0
  257. package/deps/librdkafka/src/rdtypes.h +86 -0
  258. package/deps/librdkafka/src/rdunittest.c +564 -0
  259. package/deps/librdkafka/src/rdunittest.h +232 -0
  260. package/deps/librdkafka/src/rdunittest_acknowledge.c +1177 -0
  261. package/deps/librdkafka/src/rdunittest_fetcher.c +1211 -0
  262. package/deps/librdkafka/src/rdunittest_msgset_errors.c +1521 -0
  263. package/deps/librdkafka/src/rdvarint.c +134 -0
  264. package/deps/librdkafka/src/rdvarint.h +165 -0
  265. package/deps/librdkafka/src/rdwin32.h +382 -0
  266. package/deps/librdkafka/src/rdxxhash.c +1030 -0
  267. package/deps/librdkafka/src/rdxxhash.h +328 -0
  268. package/deps/librdkafka/src/regexp.c +1352 -0
  269. package/deps/librdkafka/src/regexp.h +41 -0
  270. package/deps/librdkafka/src/snappy.c +1866 -0
  271. package/deps/librdkafka/src/snappy.h +62 -0
  272. package/deps/librdkafka/src/snappy_compat.h +138 -0
  273. package/deps/librdkafka/src/statistics_schema.json +444 -0
  274. package/deps/librdkafka/src/tinycthread.c +932 -0
  275. package/deps/librdkafka/src/tinycthread.h +503 -0
  276. package/deps/librdkafka/src/tinycthread_extra.c +210 -0
  277. package/deps/librdkafka/src/tinycthread_extra.h +218 -0
  278. package/deps/librdkafka/src/win32_config.h +58 -0
  279. package/deps/librdkafka/src-cpp/CMakeLists.txt +90 -0
  280. package/deps/librdkafka/src-cpp/ConfImpl.cpp +84 -0
  281. package/deps/librdkafka/src-cpp/ConsumerImpl.cpp +244 -0
  282. package/deps/librdkafka/src-cpp/HandleImpl.cpp +436 -0
  283. package/deps/librdkafka/src-cpp/HeadersImpl.cpp +48 -0
  284. package/deps/librdkafka/src-cpp/KafkaConsumerImpl.cpp +296 -0
  285. package/deps/librdkafka/src-cpp/Makefile +55 -0
  286. package/deps/librdkafka/src-cpp/MessageImpl.cpp +38 -0
  287. package/deps/librdkafka/src-cpp/MetadataImpl.cpp +170 -0
  288. package/deps/librdkafka/src-cpp/ProducerImpl.cpp +197 -0
  289. package/deps/librdkafka/src-cpp/QueueImpl.cpp +70 -0
  290. package/deps/librdkafka/src-cpp/README.md +16 -0
  291. package/deps/librdkafka/src-cpp/RdKafka.cpp +59 -0
  292. package/deps/librdkafka/src-cpp/TopicImpl.cpp +124 -0
  293. package/deps/librdkafka/src-cpp/TopicPartitionImpl.cpp +57 -0
  294. package/deps/librdkafka/src-cpp/rdkafkacpp.h +3797 -0
  295. package/deps/librdkafka/src-cpp/rdkafkacpp_int.h +1641 -0
  296. package/deps/librdkafka/tests/0000-unittests.c +72 -0
  297. package/deps/librdkafka/tests/0001-multiobj.c +102 -0
  298. package/deps/librdkafka/tests/0002-unkpart.c +244 -0
  299. package/deps/librdkafka/tests/0003-msgmaxsize.c +173 -0
  300. package/deps/librdkafka/tests/0004-conf.c +934 -0
  301. package/deps/librdkafka/tests/0005-order.c +133 -0
  302. package/deps/librdkafka/tests/0006-symbols.c +163 -0
  303. package/deps/librdkafka/tests/0007-autotopic.c +136 -0
  304. package/deps/librdkafka/tests/0008-reqacks.c +179 -0
  305. package/deps/librdkafka/tests/0009-mock_cluster.c +272 -0
  306. package/deps/librdkafka/tests/0011-produce_batch.c +753 -0
  307. package/deps/librdkafka/tests/0012-produce_consume.c +537 -0
  308. package/deps/librdkafka/tests/0013-null-msgs.c +473 -0
  309. package/deps/librdkafka/tests/0014-reconsume-191.c +512 -0
  310. package/deps/librdkafka/tests/0015-offset_seeks.c +172 -0
  311. package/deps/librdkafka/tests/0016-client_swname.c +181 -0
  312. package/deps/librdkafka/tests/0017-compression.c +140 -0
  313. package/deps/librdkafka/tests/0018-cgrp_term.c +444 -0
  314. package/deps/librdkafka/tests/0019-list_groups.c +289 -0
  315. package/deps/librdkafka/tests/0020-destroy_hang.c +162 -0
  316. package/deps/librdkafka/tests/0021-rkt_destroy.c +72 -0
  317. package/deps/librdkafka/tests/0022-consume_batch.c +331 -0
  318. package/deps/librdkafka/tests/0025-timers.c +147 -0
  319. package/deps/librdkafka/tests/0026-consume_pause.c +547 -0
  320. package/deps/librdkafka/tests/0028-long_topicnames.c +79 -0
  321. package/deps/librdkafka/tests/0029-assign_offset.c +202 -0
  322. package/deps/librdkafka/tests/0030-offset_commit.c +589 -0
  323. package/deps/librdkafka/tests/0031-get_offsets.c +235 -0
  324. package/deps/librdkafka/tests/0033-regex_subscribe.c +536 -0
  325. package/deps/librdkafka/tests/0034-offset_reset.c +398 -0
  326. package/deps/librdkafka/tests/0035-api_version.c +73 -0
  327. package/deps/librdkafka/tests/0036-partial_fetch.c +87 -0
  328. package/deps/librdkafka/tests/0037-destroy_hang_local.c +85 -0
  329. package/deps/librdkafka/tests/0038-performance.c +121 -0
  330. package/deps/librdkafka/tests/0039-event.c +284 -0
  331. package/deps/librdkafka/tests/0040-io_event.c +257 -0
  332. package/deps/librdkafka/tests/0041-fetch_max_bytes.c +97 -0
  333. package/deps/librdkafka/tests/0042-many_topics.c +252 -0
  334. package/deps/librdkafka/tests/0043-no_connection.c +77 -0
  335. package/deps/librdkafka/tests/0044-partition_cnt.c +94 -0
  336. package/deps/librdkafka/tests/0045-subscribe_update.c +1010 -0
  337. package/deps/librdkafka/tests/0046-rkt_cache.c +65 -0
  338. package/deps/librdkafka/tests/0047-partial_buf_tmout.c +98 -0
  339. package/deps/librdkafka/tests/0048-partitioner.c +283 -0
  340. package/deps/librdkafka/tests/0049-consume_conn_close.c +162 -0
  341. package/deps/librdkafka/tests/0050-subscribe_adds.c +145 -0
  342. package/deps/librdkafka/tests/0051-assign_adds.c +126 -0
  343. package/deps/librdkafka/tests/0052-msg_timestamps.c +238 -0
  344. package/deps/librdkafka/tests/0053-stats_cb.cpp +527 -0
  345. package/deps/librdkafka/tests/0054-offset_time.cpp +236 -0
  346. package/deps/librdkafka/tests/0055-producer_latency.c +539 -0
  347. package/deps/librdkafka/tests/0056-balanced_group_mt.c +315 -0
  348. package/deps/librdkafka/tests/0057-invalid_topic.cpp +112 -0
  349. package/deps/librdkafka/tests/0058-log.cpp +123 -0
  350. package/deps/librdkafka/tests/0059-bsearch.cpp +241 -0
  351. package/deps/librdkafka/tests/0060-op_prio.cpp +163 -0
  352. package/deps/librdkafka/tests/0061-consumer_lag.cpp +295 -0
  353. package/deps/librdkafka/tests/0062-stats_event.c +126 -0
  354. package/deps/librdkafka/tests/0063-clusterid.cpp +180 -0
  355. package/deps/librdkafka/tests/0064-interceptors.c +529 -0
  356. package/deps/librdkafka/tests/0065-yield.cpp +140 -0
  357. package/deps/librdkafka/tests/0066-plugins.cpp +143 -0
  358. package/deps/librdkafka/tests/0067-empty_topic.cpp +151 -0
  359. package/deps/librdkafka/tests/0068-produce_timeout.c +136 -0
  360. package/deps/librdkafka/tests/0069-consumer_add_parts.c +119 -0
  361. package/deps/librdkafka/tests/0070-null_empty.cpp +197 -0
  362. package/deps/librdkafka/tests/0072-headers_ut.c +448 -0
  363. package/deps/librdkafka/tests/0073-headers.c +381 -0
  364. package/deps/librdkafka/tests/0074-producev.c +87 -0
  365. package/deps/librdkafka/tests/0075-retry.c +290 -0
  366. package/deps/librdkafka/tests/0076-produce_retry.c +452 -0
  367. package/deps/librdkafka/tests/0077-compaction.c +366 -0
  368. package/deps/librdkafka/tests/0078-c_from_cpp.cpp +96 -0
  369. package/deps/librdkafka/tests/0079-fork.c +93 -0
  370. package/deps/librdkafka/tests/0080-admin_ut.c +3095 -0
  371. package/deps/librdkafka/tests/0081-admin.c +5633 -0
  372. package/deps/librdkafka/tests/0082-fetch_max_bytes.cpp +137 -0
  373. package/deps/librdkafka/tests/0083-cb_event.c +233 -0
  374. package/deps/librdkafka/tests/0084-destroy_flags.c +208 -0
  375. package/deps/librdkafka/tests/0085-headers.cpp +392 -0
  376. package/deps/librdkafka/tests/0086-purge.c +368 -0
  377. package/deps/librdkafka/tests/0088-produce_metadata_timeout.c +162 -0
  378. package/deps/librdkafka/tests/0089-max_poll_interval.c +511 -0
  379. package/deps/librdkafka/tests/0090-idempotence.c +171 -0
  380. package/deps/librdkafka/tests/0091-max_poll_interval_timeout.c +295 -0
  381. package/deps/librdkafka/tests/0092-mixed_msgver.c +103 -0
  382. package/deps/librdkafka/tests/0093-holb.c +200 -0
  383. package/deps/librdkafka/tests/0094-idempotence_msg_timeout.c +231 -0
  384. package/deps/librdkafka/tests/0095-all_brokers_down.cpp +122 -0
  385. package/deps/librdkafka/tests/0097-ssl_verify.cpp +674 -0
  386. package/deps/librdkafka/tests/0098-consumer-txn.cpp +1218 -0
  387. package/deps/librdkafka/tests/0099-commit_metadata.c +194 -0
  388. package/deps/librdkafka/tests/0100-thread_interceptors.cpp +195 -0
  389. package/deps/librdkafka/tests/0101-fetch-from-follower.cpp +446 -0
  390. package/deps/librdkafka/tests/0102-static_group_rebalance.c +836 -0
  391. package/deps/librdkafka/tests/0103-transactions.c +1383 -0
  392. package/deps/librdkafka/tests/0104-fetch_from_follower_mock.c +625 -0
  393. package/deps/librdkafka/tests/0105-transactions_mock.c +3930 -0
  394. package/deps/librdkafka/tests/0106-cgrp_sess_timeout.c +318 -0
  395. package/deps/librdkafka/tests/0107-topic_recreate.c +259 -0
  396. package/deps/librdkafka/tests/0109-auto_create_topics.cpp +278 -0
  397. package/deps/librdkafka/tests/0110-batch_size.cpp +182 -0
  398. package/deps/librdkafka/tests/0111-delay_create_topics.cpp +127 -0
  399. package/deps/librdkafka/tests/0112-assign_unknown_part.c +87 -0
  400. package/deps/librdkafka/tests/0113-cooperative_rebalance.cpp +3473 -0
  401. package/deps/librdkafka/tests/0114-sticky_partitioning.cpp +176 -0
  402. package/deps/librdkafka/tests/0115-producer_auth.cpp +182 -0
  403. package/deps/librdkafka/tests/0116-kafkaconsumer_close.cpp +216 -0
  404. package/deps/librdkafka/tests/0117-mock_errors.c +331 -0
  405. package/deps/librdkafka/tests/0118-commit_rebalance.c +154 -0
  406. package/deps/librdkafka/tests/0119-consumer_auth.cpp +167 -0
  407. package/deps/librdkafka/tests/0120-asymmetric_subscription.c +185 -0
  408. package/deps/librdkafka/tests/0121-clusterid.c +115 -0
  409. package/deps/librdkafka/tests/0122-buffer_cleaning_after_rebalance.c +227 -0
  410. package/deps/librdkafka/tests/0123-connections_max_idle.c +98 -0
  411. package/deps/librdkafka/tests/0124-openssl_invalid_engine.c +69 -0
  412. package/deps/librdkafka/tests/0125-immediate_flush.c +144 -0
  413. package/deps/librdkafka/tests/0126-oauthbearer_oidc.c +1164 -0
  414. package/deps/librdkafka/tests/0127-fetch_queue_backoff.cpp +165 -0
  415. package/deps/librdkafka/tests/0128-sasl_callback_queue.cpp +217 -0
  416. package/deps/librdkafka/tests/0129-fetch_aborted_msgs.c +79 -0
  417. package/deps/librdkafka/tests/0130-store_offsets.c +178 -0
  418. package/deps/librdkafka/tests/0131-connect_timeout.c +81 -0
  419. package/deps/librdkafka/tests/0132-strategy_ordering.c +179 -0
  420. package/deps/librdkafka/tests/0133-ssl_keys.c +150 -0
  421. package/deps/librdkafka/tests/0134-ssl_provider.c +92 -0
  422. package/deps/librdkafka/tests/0135-sasl_credentials.cpp +279 -0
  423. package/deps/librdkafka/tests/0136-resolve_cb.c +181 -0
  424. package/deps/librdkafka/tests/0137-barrier_batch_consume.c +752 -0
  425. package/deps/librdkafka/tests/0138-admin_mock.c +281 -0
  426. package/deps/librdkafka/tests/0139-offset_validation_mock.c +950 -0
  427. package/deps/librdkafka/tests/0140-commit_metadata.cpp +108 -0
  428. package/deps/librdkafka/tests/0142-reauthentication.c +931 -0
  429. package/deps/librdkafka/tests/0143-exponential_backoff_mock.c +552 -0
  430. package/deps/librdkafka/tests/0144-idempotence_mock.c +373 -0
  431. package/deps/librdkafka/tests/0145-pause_resume_mock.c +119 -0
  432. package/deps/librdkafka/tests/0146-metadata_mock.c +505 -0
  433. package/deps/librdkafka/tests/0147-consumer_group_consumer_mock.c +1210 -0
  434. package/deps/librdkafka/tests/0148-offset_fetch_commit_error_mock.c +569 -0
  435. package/deps/librdkafka/tests/0149-broker-same-host-port.c +140 -0
  436. package/deps/librdkafka/tests/0150-telemetry_mock.c +651 -0
  437. package/deps/librdkafka/tests/0151-purge-brokers.c +566 -0
  438. package/deps/librdkafka/tests/0152-rebootstrap.c +59 -0
  439. package/deps/librdkafka/tests/0153-memberid.c +128 -0
  440. package/deps/librdkafka/tests/0155-share_group_heartbeat_mock.c +2695 -0
  441. package/deps/librdkafka/tests/0156-share_consumer_fetch_mock.c +1551 -0
  442. package/deps/librdkafka/tests/0157-share_consumer_ack_mock.c +1788 -0
  443. package/deps/librdkafka/tests/0158-share_consumer_transactions_mock.c +467 -0
  444. package/deps/librdkafka/tests/0170-share_consumer_subscription.c +2192 -0
  445. package/deps/librdkafka/tests/0171-share_consumer_consume.c +2150 -0
  446. package/deps/librdkafka/tests/0172-share_consumer_acknowledge.c +1919 -0
  447. package/deps/librdkafka/tests/0173-share_consumer_commit_async.c +2735 -0
  448. package/deps/librdkafka/tests/0174-share_consumer_concurrency.c +1434 -0
  449. package/deps/librdkafka/tests/0175-share_consumer_groups.c +574 -0
  450. package/deps/librdkafka/tests/0176-share_consumer_commit_sync.c +2986 -0
  451. package/deps/librdkafka/tests/0177-share_consumer_transactions.c +1815 -0
  452. package/deps/librdkafka/tests/0178-share_consumer_close.c +2102 -0
  453. package/deps/librdkafka/tests/0179-share_consumer_destroy.c +2482 -0
  454. package/deps/librdkafka/tests/0180-share_consumer_config.c +1677 -0
  455. package/deps/librdkafka/tests/0181-share_consumer_topic_delete.c +354 -0
  456. package/deps/librdkafka/tests/0182-share_consumer_error_handling_mock.c +3358 -0
  457. package/deps/librdkafka/tests/0183-share_consumer_leader_change_mock.c +1234 -0
  458. package/deps/librdkafka/tests/0184-share_consumer_topic_recreate.c +1356 -0
  459. package/deps/librdkafka/tests/0185-share_consumer_max_poll_interval.c +557 -0
  460. package/deps/librdkafka/tests/0186-share_consumer_fatal_error.c +360 -0
  461. package/deps/librdkafka/tests/0190-share_consumer_telemetry.c +387 -0
  462. package/deps/librdkafka/tests/1000-unktopic.c +164 -0
  463. package/deps/librdkafka/tests/8000-idle.cpp +60 -0
  464. package/deps/librdkafka/tests/8001-fetch_from_follower_mock_manual.c +113 -0
  465. package/deps/librdkafka/tests/CMakeLists.txt +193 -0
  466. package/deps/librdkafka/tests/LibrdkafkaTestApp.py +291 -0
  467. package/deps/librdkafka/tests/Makefile +182 -0
  468. package/deps/librdkafka/tests/README.md +514 -0
  469. package/deps/librdkafka/tests/autotest.sh +33 -0
  470. package/deps/librdkafka/tests/backtrace.gdb +30 -0
  471. package/deps/librdkafka/tests/broker_version_tests.py +315 -0
  472. package/deps/librdkafka/tests/buildbox.sh +17 -0
  473. package/deps/librdkafka/tests/cleanup-checker-tests.sh +20 -0
  474. package/deps/librdkafka/tests/cluster_testing.py +203 -0
  475. package/deps/librdkafka/tests/delete-test-topics.sh +56 -0
  476. package/deps/librdkafka/tests/fixtures/oauthbearer/jwt_assertion_template.json +10 -0
  477. package/deps/librdkafka/tests/fixtures/ssl/Makefile +8 -0
  478. package/deps/librdkafka/tests/fixtures/ssl/README.md +13 -0
  479. package/deps/librdkafka/tests/fixtures/ssl/client.keystore.intermediate.p12 +0 -0
  480. package/deps/librdkafka/tests/fixtures/ssl/client.keystore.p12 +0 -0
  481. package/deps/librdkafka/tests/fixtures/ssl/client2.certificate.intermediate.pem +72 -0
  482. package/deps/librdkafka/tests/fixtures/ssl/client2.certificate.pem +50 -0
  483. package/deps/librdkafka/tests/fixtures/ssl/client2.intermediate.key +46 -0
  484. package/deps/librdkafka/tests/fixtures/ssl/client2.key +46 -0
  485. package/deps/librdkafka/tests/fixtures/ssl/create_keys.sh +168 -0
  486. package/deps/librdkafka/tests/fuzzers/Makefile +12 -0
  487. package/deps/librdkafka/tests/fuzzers/README.md +31 -0
  488. package/deps/librdkafka/tests/fuzzers/fuzz_regex.c +74 -0
  489. package/deps/librdkafka/tests/fuzzers/helpers.h +90 -0
  490. package/deps/librdkafka/tests/gen-ssl-certs.sh +165 -0
  491. package/deps/librdkafka/tests/interactive_broker_version.py +170 -0
  492. package/deps/librdkafka/tests/interceptor_test/CMakeLists.txt +16 -0
  493. package/deps/librdkafka/tests/interceptor_test/Makefile +22 -0
  494. package/deps/librdkafka/tests/interceptor_test/interceptor_test.c +314 -0
  495. package/deps/librdkafka/tests/interceptor_test/interceptor_test.h +54 -0
  496. package/deps/librdkafka/tests/java/IncrementalRebalanceCli.java +97 -0
  497. package/deps/librdkafka/tests/java/Makefile +13 -0
  498. package/deps/librdkafka/tests/java/Murmur2Cli.java +46 -0
  499. package/deps/librdkafka/tests/java/README.md +14 -0
  500. package/deps/librdkafka/tests/java/TransactionProducerCli.java +162 -0
  501. package/deps/librdkafka/tests/java/run-class.sh +11 -0
  502. package/deps/librdkafka/tests/librdkafka.suppressions +483 -0
  503. package/deps/librdkafka/tests/lz4_manual_test.sh +59 -0
  504. package/deps/librdkafka/tests/multi-broker-version-test.sh +50 -0
  505. package/deps/librdkafka/tests/parse-refcnt.sh +43 -0
  506. package/deps/librdkafka/tests/performance_plot.py +115 -0
  507. package/deps/librdkafka/tests/plugin_test/Makefile +19 -0
  508. package/deps/librdkafka/tests/plugin_test/plugin_test.c +58 -0
  509. package/deps/librdkafka/tests/requirements.txt +2 -0
  510. package/deps/librdkafka/tests/run-all-tests.sh +81 -0
  511. package/deps/librdkafka/tests/run-consumer-tests.sh +16 -0
  512. package/deps/librdkafka/tests/run-producer-tests.sh +16 -0
  513. package/deps/librdkafka/tests/run-test-batches.py +157 -0
  514. package/deps/librdkafka/tests/run-test.sh +141 -0
  515. package/deps/librdkafka/tests/rusage.c +249 -0
  516. package/deps/librdkafka/tests/sasl_test.py +289 -0
  517. package/deps/librdkafka/tests/scenarios/README.md +6 -0
  518. package/deps/librdkafka/tests/scenarios/ak23.json +6 -0
  519. package/deps/librdkafka/tests/scenarios/default.json +5 -0
  520. package/deps/librdkafka/tests/scenarios/noautocreate.json +5 -0
  521. package/deps/librdkafka/tests/share_telemetry_verify/share-otel-collector-config.yaml +28 -0
  522. package/deps/librdkafka/tests/sockem.c +801 -0
  523. package/deps/librdkafka/tests/sockem.h +85 -0
  524. package/deps/librdkafka/tests/sockem_ctrl.c +145 -0
  525. package/deps/librdkafka/tests/sockem_ctrl.h +61 -0
  526. package/deps/librdkafka/tests/test.c +8376 -0
  527. package/deps/librdkafka/tests/test.conf.example +27 -0
  528. package/deps/librdkafka/tests/test.h +1150 -0
  529. package/deps/librdkafka/tests/testcpp.cpp +131 -0
  530. package/deps/librdkafka/tests/testcpp.h +388 -0
  531. package/deps/librdkafka/tests/testshared.h +416 -0
  532. package/deps/librdkafka/tests/tools/README.md +4 -0
  533. package/deps/librdkafka/tests/tools/stats/README.md +21 -0
  534. package/deps/librdkafka/tests/tools/stats/filter.jq +42 -0
  535. package/deps/librdkafka/tests/tools/stats/graph.py +150 -0
  536. package/deps/librdkafka/tests/tools/stats/requirements.txt +3 -0
  537. package/deps/librdkafka/tests/tools/stats/to_csv.py +124 -0
  538. package/deps/librdkafka/tests/trivup/trivup-0.15.0.tar.gz +0 -0
  539. package/deps/librdkafka/tests/until-fail.sh +87 -0
  540. package/deps/librdkafka/tests/xxxx-assign_partition.c +122 -0
  541. package/deps/librdkafka/tests/xxxx-metadata.cpp +159 -0
  542. package/deps/librdkafka/vcpkg.json +23 -0
  543. package/deps/librdkafka/win32/README.md +5 -0
  544. package/deps/librdkafka/win32/build-package.bat +3 -0
  545. package/deps/librdkafka/win32/build.bat +19 -0
  546. package/deps/librdkafka/win32/common.vcxproj +84 -0
  547. package/deps/librdkafka/win32/interceptor_test/interceptor_test.vcxproj +87 -0
  548. package/deps/librdkafka/win32/librdkafka.autopkg.template +54 -0
  549. package/deps/librdkafka/win32/librdkafka.master.testing.targets +13 -0
  550. package/deps/librdkafka/win32/librdkafka.sln +226 -0
  551. package/deps/librdkafka/win32/librdkafka.vcxproj +282 -0
  552. package/deps/librdkafka/win32/librdkafkacpp/librdkafkacpp.vcxproj +104 -0
  553. package/deps/librdkafka/win32/msbuild.ps1 +58 -0
  554. package/deps/librdkafka/win32/openssl_engine_example/openssl_engine_example.vcxproj +132 -0
  555. package/deps/librdkafka/win32/package-zip.ps1 +46 -0
  556. package/deps/librdkafka/win32/packages/repositories.config +4 -0
  557. package/deps/librdkafka/win32/push-package.bat +4 -0
  558. package/deps/librdkafka/win32/rdkafka_complex_consumer_example_cpp/rdkafka_complex_consumer_example_cpp.vcxproj +67 -0
  559. package/deps/librdkafka/win32/rdkafka_example/rdkafka_example.vcxproj +97 -0
  560. package/deps/librdkafka/win32/rdkafka_performance/rdkafka_performance.vcxproj +97 -0
  561. package/deps/librdkafka/win32/setup-msys2.ps1 +47 -0
  562. package/deps/librdkafka/win32/setup-vcpkg.ps1 +34 -0
  563. package/deps/librdkafka/win32/tests/test.conf.example +25 -0
  564. package/deps/librdkafka/win32/tests/tests.vcxproj +278 -0
  565. package/deps/librdkafka/win32/win_ssl_cert_store/win_ssl_cert_store.vcxproj +132 -0
  566. package/deps/librdkafka/win32/wingetopt.c +564 -0
  567. package/deps/librdkafka/win32/wingetopt.h +101 -0
  568. package/deps/librdkafka/win32/wintime.h +33 -0
  569. package/deps/librdkafka.gyp +83 -0
  570. package/deps/windows-install.py +80 -0
  571. package/index.d.ts +3 -0
  572. package/lib/admin.js +732 -0
  573. package/lib/client.js +679 -0
  574. package/lib/error.js +501 -0
  575. package/lib/index.js +8 -0
  576. package/lib/kafka-consumer-stream.js +399 -0
  577. package/lib/kafka-consumer.js +798 -0
  578. package/lib/kafkajs/_admin.js +1052 -0
  579. package/lib/kafkajs/_common.js +887 -0
  580. package/lib/kafkajs/_consumer.js +2156 -0
  581. package/lib/kafkajs/_consumer_cache.js +310 -0
  582. package/lib/kafkajs/_error.js +298 -0
  583. package/lib/kafkajs/_kafka.js +125 -0
  584. package/lib/kafkajs/_linked-list.js +220 -0
  585. package/lib/kafkajs/_producer.js +863 -0
  586. package/lib/kafkajs/index.js +5 -0
  587. package/lib/producer/high-level-producer.js +400 -0
  588. package/lib/producer-stream.js +337 -0
  589. package/lib/producer.js +405 -0
  590. package/lib/rdkafka.js +44 -0
  591. package/lib/tools/ref-counter.js +53 -0
  592. package/lib/topic-partition.js +91 -0
  593. package/lib/topic.js +43 -0
  594. package/lib/util.js +55 -0
  595. package/librdkafka.js +12 -0
  596. package/package.json +85 -0
  597. package/shim/source_location +54 -0
  598. package/src/admin.cc +1597 -0
  599. package/src/admin.h +112 -0
  600. package/src/binding.cc +76 -0
  601. package/src/binding.h +25 -0
  602. package/src/callbacks.cc +676 -0
  603. package/src/callbacks.h +302 -0
  604. package/src/common.cc +1628 -0
  605. package/src/common.h +192 -0
  606. package/src/config.cc +219 -0
  607. package/src/config.h +61 -0
  608. package/src/connection.cc +703 -0
  609. package/src/connection.h +117 -0
  610. package/src/errors.cc +119 -0
  611. package/src/errors.h +60 -0
  612. package/src/kafka-consumer.cc +1539 -0
  613. package/src/kafka-consumer.h +147 -0
  614. package/src/producer.cc +917 -0
  615. package/src/producer.h +124 -0
  616. package/src/topic.cc +173 -0
  617. package/src/topic.h +54 -0
  618. package/src/workers.cc +1714 -0
  619. package/src/workers.h +690 -0
  620. package/types/config.d.ts +1269 -0
  621. package/types/errors.d.ts +373 -0
  622. package/types/kafkajs.d.ts +568 -0
  623. package/types/rdkafka.d.ts +571 -0
  624. package/util/configure.js +32 -0
  625. package/util/generate-docs.sh +18 -0
  626. package/util/get-env.js +6 -0
  627. package/util/test-compile.js +11 -0
  628. package/util/test-producer-delivery.js +100 -0
@@ -0,0 +1,1309 @@
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 rd_kafka_telemetry_metric_value_t
311
+ calculate_share_consumer_poll_idle_ratio_avg(rd_kafka_t *rk,
312
+ rd_kafka_broker_t *rkb_selected,
313
+ rd_ts_t now_ns) {
314
+ rd_kafka_telemetry_metric_value_t share_poll_idle_avg;
315
+ share_poll_idle_avg.double_value = calculate_avg(
316
+ rk->rk_telemetry.rd_avg_rollover.rk_avg_share_poll_idle_ratio, 1e6);
317
+ return share_poll_idle_avg;
318
+ }
319
+
320
+ static rd_kafka_telemetry_metric_value_t
321
+ calculate_share_time_between_poll_avg(rd_kafka_t *rk,
322
+ rd_kafka_broker_t *rkb_selected,
323
+ rd_ts_t now_ns) {
324
+ rd_kafka_telemetry_metric_value_t time_between_poll_avg;
325
+ time_between_poll_avg.double_value = calculate_avg(
326
+ rk->rk_telemetry.rd_avg_rollover.rk_avg_share_time_between_poll,
327
+ THREE_ORDERS_MAGNITUDE);
328
+ return time_between_poll_avg;
329
+ }
330
+
331
+ static rd_kafka_telemetry_metric_value_t
332
+ calculate_share_time_between_poll_max(rd_kafka_t *rk,
333
+ rd_kafka_broker_t *rkb_selected,
334
+ rd_ts_t now_ns) {
335
+ rd_kafka_telemetry_metric_value_t time_between_poll_max;
336
+ time_between_poll_max.int_value = calculate_max(
337
+ rk->rk_telemetry.rd_avg_rollover.rk_avg_share_time_between_poll,
338
+ THREE_ORDERS_MAGNITUDE);
339
+ return time_between_poll_max;
340
+ }
341
+
342
+ static rd_kafka_telemetry_metric_value_t
343
+ calculate_share_fetch_latency_avg(rd_kafka_t *rk,
344
+ rd_kafka_broker_t *rkb_selected,
345
+ rd_ts_t now_ns) {
346
+ rd_kafka_telemetry_metric_value_t avg_share_fetch_latency;
347
+ brokers_avg(rk, rkb_avg_share_fetch_latency, THREE_ORDERS_MAGNITUDE,
348
+ avg_share_fetch_latency);
349
+ return avg_share_fetch_latency;
350
+ }
351
+
352
+ static rd_kafka_telemetry_metric_value_t
353
+ calculate_share_fetch_latency_max(rd_kafka_t *rk,
354
+ rd_kafka_broker_t *rkb_selected,
355
+ rd_ts_t now_ns) {
356
+ rd_kafka_telemetry_metric_value_t max_share_fetch_latency;
357
+ brokers_max(rk, rkb_avg_share_fetch_latency, THREE_ORDERS_MAGNITUDE,
358
+ max_share_fetch_latency);
359
+ return max_share_fetch_latency;
360
+ }
361
+
362
+ static rd_kafka_telemetry_metric_value_t
363
+ calculate_share_bytes_consumed_total(rd_kafka_t *rk,
364
+ rd_kafka_broker_t *rkb_selected,
365
+ rd_ts_t now_ns) {
366
+ rd_kafka_telemetry_metric_value_t bytes_consumed_total;
367
+ int64_t current =
368
+ rd_atomic64_get(&rk->rk_telemetry.share_bytes_consumed_total);
369
+
370
+ if (!rk->rk_telemetry.delta_temporality)
371
+ bytes_consumed_total.int_value = current;
372
+ else
373
+ bytes_consumed_total.int_value =
374
+ current -
375
+ rk->rk_telemetry.rk_historic_c.share_bytes_consumed_total;
376
+
377
+ return bytes_consumed_total;
378
+ }
379
+
380
+ static rd_kafka_telemetry_metric_value_t
381
+ calculate_share_bytes_consumed_rate(rd_kafka_t *rk,
382
+ rd_kafka_broker_t *rkb_selected,
383
+ rd_ts_t now_ns) {
384
+ rd_kafka_telemetry_metric_value_t bytes_consumed_rate;
385
+ rd_ts_t ts_last = rk->rk_telemetry.rk_historic_c.ts_last;
386
+ int64_t delta =
387
+ rd_atomic64_get(&rk->rk_telemetry.share_bytes_consumed_total) -
388
+ rk->rk_telemetry.rk_historic_c.share_bytes_consumed_total;
389
+ double seconds = (now_ns - ts_last) / 1e9;
390
+
391
+ if (seconds > 1.0)
392
+ bytes_consumed_rate.double_value = (double)delta / seconds;
393
+ else
394
+ bytes_consumed_rate.double_value = (double)delta;
395
+
396
+ return bytes_consumed_rate;
397
+ }
398
+
399
+ static rd_kafka_telemetry_metric_value_t
400
+ calculate_share_fetch_size_avg(rd_kafka_t *rk,
401
+ rd_kafka_broker_t *rkb_selected,
402
+ rd_ts_t now_ns) {
403
+ rd_kafka_telemetry_metric_value_t avg_share_fetch_size;
404
+ brokers_avg(rk, rkb_avg_share_fetch_size, 1, avg_share_fetch_size);
405
+ return avg_share_fetch_size;
406
+ }
407
+
408
+ static rd_kafka_telemetry_metric_value_t
409
+ calculate_share_fetch_size_max(rd_kafka_t *rk,
410
+ rd_kafka_broker_t *rkb_selected,
411
+ rd_ts_t now_ns) {
412
+ rd_kafka_telemetry_metric_value_t max_share_fetch_size;
413
+ brokers_max(rk, rkb_avg_share_fetch_size, 1, max_share_fetch_size);
414
+ return max_share_fetch_size;
415
+ }
416
+
417
+ static rd_kafka_telemetry_metric_value_t
418
+ calculate_share_fetch_total(rd_kafka_t *rk,
419
+ rd_kafka_broker_t *rkb_selected,
420
+ rd_ts_t now_ns) {
421
+ rd_kafka_telemetry_metric_value_t share_fetch_total;
422
+ int64_t current = rd_atomic64_get(&rk->rk_telemetry.share_fetch_total);
423
+
424
+ if (!rk->rk_telemetry.delta_temporality)
425
+ share_fetch_total.int_value = current;
426
+ else
427
+ share_fetch_total.int_value =
428
+ current - rk->rk_telemetry.rk_historic_c.share_fetch_total;
429
+
430
+ return share_fetch_total;
431
+ }
432
+
433
+ static rd_kafka_telemetry_metric_value_t
434
+ calculate_share_fetch_rate(rd_kafka_t *rk,
435
+ rd_kafka_broker_t *rkb_selected,
436
+ rd_ts_t now_ns) {
437
+ rd_kafka_telemetry_metric_value_t share_fetch_rate;
438
+ rd_ts_t ts_last = rk->rk_telemetry.rk_historic_c.ts_last;
439
+ int64_t delta = rd_atomic64_get(&rk->rk_telemetry.share_fetch_total) -
440
+ rk->rk_telemetry.rk_historic_c.share_fetch_total;
441
+ double seconds = (now_ns - ts_last) / 1e9;
442
+
443
+ /* For sub-second intervals (e.g. the first reading) report the raw
444
+ * delta instead of dividing, to avoid a tiny denominator massively
445
+ * overstating the rate. Same logic as the other rate metrics. */
446
+ if (seconds > 1.0)
447
+ share_fetch_rate.double_value = (double)delta / seconds;
448
+ else
449
+ share_fetch_rate.double_value = (double)delta;
450
+
451
+ return share_fetch_rate;
452
+ }
453
+
454
+ static rd_kafka_telemetry_metric_value_t
455
+ calculate_share_acknowledgements_send_total(rd_kafka_t *rk,
456
+ rd_kafka_broker_t *rkb_selected,
457
+ rd_ts_t now_ns) {
458
+ rd_kafka_telemetry_metric_value_t acknowledgements_send_total;
459
+ int64_t current =
460
+ rd_atomic64_get(&rk->rk_telemetry.acknowledgements_send_total);
461
+
462
+ if (!rk->rk_telemetry.delta_temporality)
463
+ acknowledgements_send_total.int_value = current;
464
+ else
465
+ acknowledgements_send_total.int_value =
466
+ current -
467
+ rk->rk_telemetry.rk_historic_c.acknowledgements_send_total;
468
+
469
+ return acknowledgements_send_total;
470
+ }
471
+
472
+ static rd_kafka_telemetry_metric_value_t
473
+ calculate_share_acknowledgements_send_rate(rd_kafka_t *rk,
474
+ rd_kafka_broker_t *rkb_selected,
475
+ rd_ts_t now_ns) {
476
+ rd_kafka_telemetry_metric_value_t acknowledgements_send_rate;
477
+ rd_ts_t ts_last = rk->rk_telemetry.rk_historic_c.ts_last;
478
+ int64_t delta =
479
+ rd_atomic64_get(&rk->rk_telemetry.acknowledgements_send_total) -
480
+ rk->rk_telemetry.rk_historic_c.acknowledgements_send_total;
481
+ double seconds = (now_ns - ts_last) / 1e9;
482
+
483
+ /* For sub-second intervals (e.g. the first reading) report the raw
484
+ * delta instead of dividing, to avoid a tiny denominator massively
485
+ * overstating the rate. Same logic as the other rate metrics. */
486
+ if (seconds > 1.0)
487
+ acknowledgements_send_rate.double_value =
488
+ (double)delta / seconds;
489
+ else
490
+ acknowledgements_send_rate.double_value = (double)delta;
491
+
492
+ return acknowledgements_send_rate;
493
+ }
494
+
495
+ static rd_kafka_telemetry_metric_value_t
496
+ calculate_share_heartbeat_total(rd_kafka_t *rk,
497
+ rd_kafka_broker_t *rkb_selected,
498
+ rd_ts_t now_ns) {
499
+ rd_kafka_telemetry_metric_value_t heartbeat_total;
500
+ int64_t current = rd_atomic64_get(&rk->rk_telemetry.heartbeat_total);
501
+
502
+ if (!rk->rk_telemetry.delta_temporality)
503
+ heartbeat_total.int_value = current;
504
+ else
505
+ heartbeat_total.int_value =
506
+ current - rk->rk_telemetry.rk_historic_c.heartbeat_total;
507
+
508
+ return heartbeat_total;
509
+ }
510
+
511
+ static rd_kafka_telemetry_metric_value_t
512
+ calculate_share_heartbeat_rate(rd_kafka_t *rk,
513
+ rd_kafka_broker_t *rkb_selected,
514
+ rd_ts_t now_ns) {
515
+ rd_kafka_telemetry_metric_value_t heartbeat_rate;
516
+ rd_ts_t ts_last = rk->rk_telemetry.rk_historic_c.ts_last;
517
+ int64_t delta = rd_atomic64_get(&rk->rk_telemetry.heartbeat_total) -
518
+ rk->rk_telemetry.rk_historic_c.heartbeat_total;
519
+ double seconds = (now_ns - ts_last) / 1e9;
520
+
521
+ if (seconds > 1.0)
522
+ heartbeat_rate.double_value = (double)delta / seconds;
523
+ else
524
+ heartbeat_rate.double_value = (double)delta;
525
+
526
+ return heartbeat_rate;
527
+ }
528
+
529
+ static void reset_historical_metrics(rd_kafka_t *rk, rd_ts_t now_ns) {
530
+ rd_kafka_broker_t *rkb;
531
+
532
+ rk->rk_telemetry.rk_historic_c.ts_last = now_ns;
533
+ rk->rk_telemetry.rk_historic_c.rebalance_latency_total +=
534
+ RD_CEIL_INTEGER_DIVISION(rk->rk_telemetry.rd_avg_rollover
535
+ .rk_avg_rebalance_latency.ra_v.sum,
536
+ THREE_ORDERS_MAGNITUDE);
537
+
538
+ TAILQ_FOREACH(rkb, &rk->rk_brokers, rkb_link) {
539
+ rkb->rkb_telemetry.rkb_historic_c.connects =
540
+ rd_atomic32_get(&rkb->rkb_c.connects);
541
+ }
542
+
543
+ if (RD_KAFKA_IS_SHARE_CONSUMER(rk)) {
544
+ rk->rk_telemetry.rk_historic_c.share_fetch_total =
545
+ rd_atomic64_get(&rk->rk_telemetry.share_fetch_total);
546
+ rk->rk_telemetry.rk_historic_c.share_bytes_consumed_total =
547
+ rd_atomic64_get(
548
+ &rk->rk_telemetry.share_bytes_consumed_total);
549
+ rk->rk_telemetry.rk_historic_c.acknowledgements_send_total =
550
+ rd_atomic64_get(
551
+ &rk->rk_telemetry.acknowledgements_send_total);
552
+ rk->rk_telemetry.rk_historic_c.heartbeat_total =
553
+ rd_atomic64_get(&rk->rk_telemetry.heartbeat_total);
554
+ }
555
+ }
556
+
557
+ static const rd_kafka_telemetry_metric_value_calculator_t
558
+ PRODUCER_METRIC_VALUE_CALCULATORS[RD_KAFKA_TELEMETRY_PRODUCER_METRIC__CNT] =
559
+ {
560
+ [RD_KAFKA_TELEMETRY_METRIC_PRODUCER_CONNECTION_CREATION_RATE] =
561
+ &calculate_connection_creation_rate,
562
+ [RD_KAFKA_TELEMETRY_METRIC_PRODUCER_CONNECTION_CREATION_TOTAL] =
563
+ &calculate_connection_creation_total,
564
+ [RD_KAFKA_TELEMETRY_METRIC_PRODUCER_NODE_REQUEST_LATENCY_AVG] =
565
+ &calculate_broker_avg_rtt,
566
+ [RD_KAFKA_TELEMETRY_METRIC_PRODUCER_NODE_REQUEST_LATENCY_MAX] =
567
+ &calculate_broker_max_rtt,
568
+ [RD_KAFKA_TELEMETRY_METRIC_PRODUCER_PRODUCE_THROTTLE_TIME_AVG] =
569
+ &calculate_throttle_avg,
570
+ [RD_KAFKA_TELEMETRY_METRIC_PRODUCER_PRODUCE_THROTTLE_TIME_MAX] =
571
+ &calculate_throttle_max,
572
+ [RD_KAFKA_TELEMETRY_METRIC_PRODUCER_RECORD_QUEUE_TIME_AVG] =
573
+ &calculate_queue_time_avg,
574
+ [RD_KAFKA_TELEMETRY_METRIC_PRODUCER_RECORD_QUEUE_TIME_MAX] =
575
+ &calculate_queue_time_max,
576
+ [RD_KAFKA_TELEMETRY_METRIC_PRODUCER_PRODUCE_LATENCY_AVG] =
577
+ &calculate_produce_latency_avg,
578
+ [RD_KAFKA_TELEMETRY_METRIC_PRODUCER_PRODUCE_LATENCY_MAX] =
579
+ &calculate_produce_latency_max,
580
+ };
581
+
582
+ static const rd_kafka_telemetry_metric_value_calculator_t
583
+ CONSUMER_METRIC_VALUE_CALCULATORS[RD_KAFKA_TELEMETRY_CONSUMER_METRIC__CNT] = {
584
+ [RD_KAFKA_TELEMETRY_METRIC_CONSUMER_CONNECTION_CREATION_RATE] =
585
+ &calculate_connection_creation_rate,
586
+ [RD_KAFKA_TELEMETRY_METRIC_CONSUMER_CONNECTION_CREATION_TOTAL] =
587
+ &calculate_connection_creation_total,
588
+ [RD_KAFKA_TELEMETRY_METRIC_CONSUMER_NODE_REQUEST_LATENCY_AVG] =
589
+ &calculate_broker_avg_rtt,
590
+ [RD_KAFKA_TELEMETRY_METRIC_CONSUMER_NODE_REQUEST_LATENCY_MAX] =
591
+ &calculate_broker_max_rtt,
592
+ [RD_KAFKA_TELEMETRY_METRIC_CONSUMER_COORDINATOR_ASSIGNED_PARTITIONS] =
593
+ &calculate_consumer_assigned_partitions,
594
+ [RD_KAFKA_TELEMETRY_METRIC_CONSUMER_COORDINATOR_REBALANCE_LATENCY_AVG] =
595
+ &calculate_consumer_rebalance_latency_avg,
596
+ [RD_KAFKA_TELEMETRY_METRIC_CONSUMER_COORDINATOR_REBALANCE_LATENCY_MAX] =
597
+ &calculate_consumer_rebalance_latency_max,
598
+ [RD_KAFKA_TELEMETRY_METRIC_CONSUMER_COORDINATOR_REBALANCE_LATENCY_TOTAL] =
599
+ &calculate_consumer_rebalance_latency_total,
600
+ [RD_KAFKA_TELEMETRY_METRIC_CONSUMER_FETCH_MANAGER_FETCH_LATENCY_AVG] =
601
+ &calculate_consumer_fetch_latency_avg,
602
+ [RD_KAFKA_TELEMETRY_METRIC_CONSUMER_FETCH_MANAGER_FETCH_LATENCY_MAX] =
603
+ &calculate_consumer_fetch_latency_max,
604
+ [RD_KAFKA_TELEMETRY_METRIC_CONSUMER_POLL_IDLE_RATIO_AVG] =
605
+ &calculate_consumer_poll_idle_ratio_avg,
606
+ [RD_KAFKA_TELEMETRY_METRIC_CONSUMER_COORDINATOR_COMMIT_LATENCY_AVG] =
607
+ &calculate_consumer_commit_latency_avg,
608
+ [RD_KAFKA_TELEMETRY_METRIC_CONSUMER_COORDINATOR_COMMIT_LATENCY_MAX] =
609
+ &calculate_consumer_commit_latency_max,
610
+ };
611
+
612
+ static const rd_kafka_telemetry_metric_value_calculator_t SHARE_CONSUMER_METRIC_VALUE_CALCULATORS
613
+ [RD_KAFKA_TELEMETRY_SHARE_CONSUMER_METRIC__CNT] = {
614
+ [RD_KAFKA_TELEMETRY_METRIC_SHARE_CONSUMER_POLL_IDLE_RATIO_AVG] =
615
+ &calculate_share_consumer_poll_idle_ratio_avg,
616
+ [RD_KAFKA_TELEMETRY_METRIC_SHARE_CONSUMER_TIME_BETWEEN_POLL_AVG] =
617
+ &calculate_share_time_between_poll_avg,
618
+ [RD_KAFKA_TELEMETRY_METRIC_SHARE_CONSUMER_TIME_BETWEEN_POLL_MAX] =
619
+ &calculate_share_time_between_poll_max,
620
+ [RD_KAFKA_TELEMETRY_METRIC_SHARE_CONSUMER_FETCH_TOTAL] =
621
+ &calculate_share_fetch_total,
622
+ [RD_KAFKA_TELEMETRY_METRIC_SHARE_CONSUMER_FETCH_RATE] =
623
+ &calculate_share_fetch_rate,
624
+ [RD_KAFKA_TELEMETRY_METRIC_SHARE_CONSUMER_FETCH_LATENCY_AVG] =
625
+ &calculate_share_fetch_latency_avg,
626
+ [RD_KAFKA_TELEMETRY_METRIC_SHARE_CONSUMER_FETCH_LATENCY_MAX] =
627
+ &calculate_share_fetch_latency_max,
628
+ [RD_KAFKA_TELEMETRY_METRIC_SHARE_CONSUMER_ACKNOWLEDGEMENTS_SEND_TOTAL] =
629
+ &calculate_share_acknowledgements_send_total,
630
+ [RD_KAFKA_TELEMETRY_METRIC_SHARE_CONSUMER_ACKNOWLEDGEMENTS_SEND_RATE] =
631
+ &calculate_share_acknowledgements_send_rate,
632
+ [RD_KAFKA_TELEMETRY_METRIC_SHARE_CONSUMER_FETCH_THROTTLE_TIME_AVG] =
633
+ &calculate_throttle_avg,
634
+ [RD_KAFKA_TELEMETRY_METRIC_SHARE_CONSUMER_FETCH_THROTTLE_TIME_MAX] =
635
+ &calculate_throttle_max,
636
+ [RD_KAFKA_TELEMETRY_METRIC_SHARE_CONSUMER_COORDINATOR_HEARTBEAT_TOTAL] =
637
+ &calculate_share_heartbeat_total,
638
+ [RD_KAFKA_TELEMETRY_METRIC_SHARE_CONSUMER_COORDINATOR_HEARTBEAT_RATE] =
639
+ &calculate_share_heartbeat_rate,
640
+ [RD_KAFKA_TELEMETRY_METRIC_SHARE_CONSUMER_FETCH_SIZE_AVG] =
641
+ &calculate_share_fetch_size_avg,
642
+ [RD_KAFKA_TELEMETRY_METRIC_SHARE_CONSUMER_FETCH_SIZE_MAX] =
643
+ &calculate_share_fetch_size_max,
644
+ [RD_KAFKA_TELEMETRY_METRIC_SHARE_CONSUMER_BYTES_CONSUMED_TOTAL] =
645
+ &calculate_share_bytes_consumed_total,
646
+ [RD_KAFKA_TELEMETRY_METRIC_SHARE_CONSUMER_BYTES_CONSUMED_RATE] =
647
+ &calculate_share_bytes_consumed_rate,
648
+ };
649
+
650
+ static const char *get_client_rack(const rd_kafka_t *rk) {
651
+ return rk->rk_conf.client_rack &&
652
+ RD_KAFKAP_STR_LEN(rk->rk_conf.client_rack)
653
+ ? (const char *)rk->rk_conf.client_rack->str
654
+ : NULL;
655
+ }
656
+
657
+ static const char *get_group_id(const rd_kafka_t *rk) {
658
+ return rk->rk_conf.group_id_str ? (const char *)rk->rk_conf.group_id_str
659
+ : NULL;
660
+ }
661
+
662
+ static const char *get_group_instance_id(const rd_kafka_t *rk) {
663
+ return rk->rk_conf.group_instance_id
664
+ ? (const char *)rk->rk_conf.group_instance_id
665
+ : NULL;
666
+ }
667
+
668
+ static const char *get_member_id(const rd_kafka_t *rk) {
669
+ return rk->rk_cgrp && rk->rk_cgrp->rkcg_member_id &&
670
+ rk->rk_cgrp->rkcg_member_id->len > 0
671
+ ? (const char *)rk->rk_cgrp->rkcg_member_id->str
672
+ : NULL;
673
+ }
674
+
675
+ static const char *get_transactional_id(const rd_kafka_t *rk) {
676
+ return rk->rk_conf.eos.transactional_id
677
+ ? (const char *)rk->rk_conf.eos.transactional_id
678
+ : NULL;
679
+ }
680
+
681
+ static const rd_kafka_telemetry_attribute_config_t producer_attributes[] = {
682
+ {"client_rack", get_client_rack},
683
+ {"transactional_id", get_transactional_id},
684
+ };
685
+
686
+ static const rd_kafka_telemetry_attribute_config_t consumer_attributes[] = {
687
+ {"client_rack", get_client_rack},
688
+ {"group_id", get_group_id},
689
+ {"group_instance_id", get_group_instance_id},
690
+ {"member_id", get_member_id},
691
+ };
692
+
693
+ static int
694
+ count_attributes(rd_kafka_t *rk,
695
+ const rd_kafka_telemetry_attribute_config_t *configs,
696
+ int config_count) {
697
+ int count = 0, i;
698
+ for (i = 0; i < config_count; ++i) {
699
+ if (configs[i].getValue(rk)) {
700
+ count++;
701
+ }
702
+ }
703
+ return count;
704
+ }
705
+
706
+ static void set_attributes(rd_kafka_t *rk,
707
+ rd_kafka_telemetry_resource_attribute_t *attributes,
708
+ const rd_kafka_telemetry_attribute_config_t *configs,
709
+ int config_count) {
710
+ int attr_idx = 0, i;
711
+ for (i = 0; i < config_count; ++i) {
712
+ const char *value = configs[i].getValue(rk);
713
+ if (value) {
714
+ attributes[attr_idx].name = configs[i].name;
715
+ attributes[attr_idx].value = value;
716
+ attr_idx++;
717
+ }
718
+ }
719
+ }
720
+
721
+ static int
722
+ resource_attributes(rd_kafka_t *rk,
723
+ rd_kafka_telemetry_resource_attribute_t **attributes) {
724
+ int count = 0;
725
+ const rd_kafka_telemetry_attribute_config_t *configs;
726
+ int config_count;
727
+
728
+ if (rk->rk_type == RD_KAFKA_PRODUCER) {
729
+ configs = producer_attributes;
730
+ config_count = RD_ARRAY_SIZE(producer_attributes);
731
+ } else if (rk->rk_type == RD_KAFKA_CONSUMER) {
732
+ configs = consumer_attributes;
733
+ config_count = RD_ARRAY_SIZE(consumer_attributes);
734
+ } else {
735
+ *attributes = NULL;
736
+ return 0;
737
+ }
738
+
739
+ count = count_attributes(rk, configs, config_count);
740
+
741
+ if (count == 0) {
742
+ *attributes = NULL;
743
+ return 0;
744
+ }
745
+
746
+ *attributes =
747
+ rd_malloc(sizeof(rd_kafka_telemetry_resource_attribute_t) * count);
748
+
749
+ set_attributes(rk, *attributes, configs, config_count);
750
+
751
+ return count;
752
+ }
753
+
754
+ static bool
755
+ encode_string(pb_ostream_t *stream, const pb_field_t *field, void *const *arg) {
756
+ if (!pb_encode_tag_for_field(stream, field))
757
+ return false;
758
+ return pb_encode_string(stream, (uint8_t *)(*arg), strlen(*arg));
759
+ }
760
+
761
+ // TODO: Update to handle multiple data points.
762
+ static bool encode_number_data_point(pb_ostream_t *stream,
763
+ const pb_field_t *field,
764
+ void *const *arg) {
765
+ opentelemetry_proto_metrics_v1_NumberDataPoint *data_point =
766
+ (opentelemetry_proto_metrics_v1_NumberDataPoint *)*arg;
767
+ if (!pb_encode_tag_for_field(stream, field))
768
+ return false;
769
+
770
+ return pb_encode_submessage(
771
+ stream, opentelemetry_proto_metrics_v1_NumberDataPoint_fields,
772
+ data_point);
773
+ }
774
+
775
+ static bool
776
+ encode_metric(pb_ostream_t *stream, const pb_field_t *field, void *const *arg) {
777
+ rd_kafka_telemetry_metrics_repeated_t *metricArr =
778
+ (rd_kafka_telemetry_metrics_repeated_t *)*arg;
779
+ size_t i;
780
+
781
+ for (i = 0; i < metricArr->count; i++) {
782
+
783
+ opentelemetry_proto_metrics_v1_Metric *metric =
784
+ metricArr->metrics[i];
785
+ if (!pb_encode_tag_for_field(stream, field))
786
+ return false;
787
+
788
+ if (!pb_encode_submessage(
789
+ stream, opentelemetry_proto_metrics_v1_Metric_fields,
790
+ metric))
791
+ return false;
792
+ }
793
+ return true;
794
+ }
795
+
796
+ static bool encode_scope_metrics(pb_ostream_t *stream,
797
+ const pb_field_t *field,
798
+ void *const *arg) {
799
+ opentelemetry_proto_metrics_v1_ScopeMetrics *scope_metrics =
800
+ (opentelemetry_proto_metrics_v1_ScopeMetrics *)*arg;
801
+ if (!pb_encode_tag_for_field(stream, field))
802
+ return false;
803
+
804
+ return pb_encode_submessage(
805
+ stream, opentelemetry_proto_metrics_v1_ScopeMetrics_fields,
806
+ scope_metrics);
807
+ }
808
+
809
+ static bool encode_resource_metrics(pb_ostream_t *stream,
810
+ const pb_field_t *field,
811
+ void *const *arg) {
812
+ opentelemetry_proto_metrics_v1_ResourceMetrics *resource_metrics =
813
+ (opentelemetry_proto_metrics_v1_ResourceMetrics *)*arg;
814
+ if (!pb_encode_tag_for_field(stream, field))
815
+ return false;
816
+
817
+ return pb_encode_submessage(
818
+ stream, opentelemetry_proto_metrics_v1_ResourceMetrics_fields,
819
+ resource_metrics);
820
+ }
821
+
822
+ static bool encode_key_value(pb_ostream_t *stream,
823
+ const pb_field_t *field,
824
+ void *const *arg) {
825
+ if (!pb_encode_tag_for_field(stream, field))
826
+ return false;
827
+ opentelemetry_proto_common_v1_KeyValue *key_value =
828
+ (opentelemetry_proto_common_v1_KeyValue *)*arg;
829
+ return pb_encode_submessage(
830
+ stream, opentelemetry_proto_common_v1_KeyValue_fields, key_value);
831
+ }
832
+
833
+ static bool encode_key_values(pb_ostream_t *stream,
834
+ const pb_field_t *field,
835
+ void *const *arg) {
836
+ rd_kafka_telemetry_key_values_repeated_t *kv_arr =
837
+ (rd_kafka_telemetry_key_values_repeated_t *)*arg;
838
+ size_t i;
839
+
840
+ for (i = 0; i < kv_arr->count; i++) {
841
+
842
+ opentelemetry_proto_common_v1_KeyValue *kv =
843
+ kv_arr->key_values[i];
844
+ if (!pb_encode_tag_for_field(stream, field))
845
+ return false;
846
+
847
+ if (!pb_encode_submessage(
848
+ stream, opentelemetry_proto_common_v1_KeyValue_fields,
849
+ kv))
850
+ return false;
851
+ }
852
+ return true;
853
+ }
854
+
855
+ static void free_metrics(
856
+ opentelemetry_proto_metrics_v1_Metric **metrics,
857
+ char **metric_names,
858
+ opentelemetry_proto_metrics_v1_NumberDataPoint **data_points,
859
+ opentelemetry_proto_common_v1_KeyValue *datapoint_attributes_key_values,
860
+ size_t count) {
861
+ size_t i;
862
+ for (i = 0; i < count; i++) {
863
+ rd_free(data_points[i]);
864
+ rd_free(metric_names[i]);
865
+ rd_free(metrics[i]);
866
+ }
867
+ rd_free(data_points);
868
+ rd_free(metric_names);
869
+ rd_free(metrics);
870
+ rd_free(datapoint_attributes_key_values);
871
+ }
872
+
873
+ static void free_resource_attributes(
874
+ opentelemetry_proto_common_v1_KeyValue **resource_attributes_key_values,
875
+ rd_kafka_telemetry_resource_attribute_t *resource_attributes_struct,
876
+ size_t count) {
877
+ size_t i;
878
+ if (count == 0)
879
+ return;
880
+ for (i = 0; i < count; i++)
881
+ rd_free(resource_attributes_key_values[i]);
882
+ rd_free(resource_attributes_struct);
883
+ rd_free(resource_attributes_key_values);
884
+ }
885
+
886
+ static void serialize_Metric(
887
+ rd_kafka_t *rk,
888
+ rd_kafka_broker_t *rkb,
889
+ const rd_kafka_telemetry_metric_info_t *info,
890
+ opentelemetry_proto_metrics_v1_Metric **metric,
891
+ opentelemetry_proto_metrics_v1_NumberDataPoint **data_point,
892
+ opentelemetry_proto_common_v1_KeyValue *data_point_attribute,
893
+ rd_kafka_telemetry_metric_value_calculator_t metric_value_calculator,
894
+ char **metric_name,
895
+ bool is_per_broker,
896
+ rd_ts_t now_ns) {
897
+ rd_ts_t ts_last = rk->rk_telemetry.rk_historic_c.ts_last,
898
+ ts_start = rk->rk_telemetry.rk_historic_c.ts_start;
899
+ size_t metric_name_len;
900
+ if (info->is_int) {
901
+ (*data_point)->which_value =
902
+ opentelemetry_proto_metrics_v1_NumberDataPoint_as_int_tag;
903
+ (*data_point)->value.as_int =
904
+ metric_value_calculator(rk, rkb, now_ns).int_value;
905
+ } else {
906
+ (*data_point)->which_value =
907
+ opentelemetry_proto_metrics_v1_NumberDataPoint_as_double_tag;
908
+ (*data_point)->value.as_double =
909
+ metric_value_calculator(rk, rkb, now_ns).double_value;
910
+ }
911
+
912
+
913
+ (*data_point)->time_unix_nano = now_ns;
914
+ if (info->type == RD_KAFKA_TELEMETRY_METRIC_TYPE_GAUGE ||
915
+ (info->type == RD_KAFKA_TELEMETRY_METRIC_TYPE_SUM &&
916
+ rk->rk_telemetry.delta_temporality))
917
+ (*data_point)->start_time_unix_nano = ts_last;
918
+ else
919
+ (*data_point)->start_time_unix_nano = ts_start;
920
+
921
+ if (is_per_broker) {
922
+ data_point_attribute->key.funcs.encode = &encode_string;
923
+ data_point_attribute->key.arg =
924
+ RD_KAFKA_TELEMETRY_METRIC_NODE_ID_ATTRIBUTE;
925
+ data_point_attribute->has_value = true;
926
+ data_point_attribute->value.which_value =
927
+ opentelemetry_proto_common_v1_AnyValue_int_value_tag;
928
+
929
+ rd_kafka_broker_lock(rkb);
930
+ data_point_attribute->value.value.int_value = rkb->rkb_nodeid;
931
+ rd_kafka_broker_unlock(rkb);
932
+
933
+ (*data_point)->attributes.funcs.encode = &encode_key_value;
934
+ (*data_point)->attributes.arg = data_point_attribute;
935
+ }
936
+
937
+
938
+ switch (info->type) {
939
+
940
+ case RD_KAFKA_TELEMETRY_METRIC_TYPE_SUM: {
941
+ (*metric)->which_data =
942
+ opentelemetry_proto_metrics_v1_Metric_sum_tag;
943
+ (*metric)->data.sum.data_points.funcs.encode =
944
+ &encode_number_data_point;
945
+ (*metric)->data.sum.data_points.arg = *data_point;
946
+ (*metric)->data.sum.aggregation_temporality =
947
+ rk->rk_telemetry.delta_temporality
948
+ ? opentelemetry_proto_metrics_v1_AggregationTemporality_AGGREGATION_TEMPORALITY_DELTA
949
+ : opentelemetry_proto_metrics_v1_AggregationTemporality_AGGREGATION_TEMPORALITY_CUMULATIVE;
950
+ (*metric)->data.sum.is_monotonic = true;
951
+ break;
952
+ }
953
+ case RD_KAFKA_TELEMETRY_METRIC_TYPE_GAUGE: {
954
+ (*metric)->which_data =
955
+ opentelemetry_proto_metrics_v1_Metric_gauge_tag;
956
+ (*metric)->data.gauge.data_points.funcs.encode =
957
+ &encode_number_data_point;
958
+ (*metric)->data.gauge.data_points.arg = *data_point;
959
+ break;
960
+ }
961
+ default:
962
+ rd_assert(!"Unknown metric type");
963
+ break;
964
+ }
965
+
966
+ (*metric)->description.funcs.encode = &encode_string;
967
+ (*metric)->description.arg = (void *)info->description;
968
+
969
+ metric_name_len =
970
+ strlen(RD_KAFKA_TELEMETRY_METRIC_PREFIX) + strlen(info->name) + 1;
971
+ *metric_name = rd_calloc(1, metric_name_len);
972
+ rd_snprintf(*metric_name, metric_name_len, "%s%s",
973
+ RD_KAFKA_TELEMETRY_METRIC_PREFIX, info->name);
974
+
975
+
976
+ (*metric)->name.funcs.encode = &encode_string;
977
+ (*metric)->name.arg = *metric_name;
978
+
979
+ /* Skipping unit as Java client does the same */
980
+ }
981
+
982
+ /**
983
+ * @brief Encodes the metrics to opentelemetry_proto_metrics_v1_MetricsData and
984
+ * returns the serialized data. Currently only supports encoding of connection
985
+ * creation total by default
986
+ *
987
+ * @locks none
988
+ * @locks_acquired rd_kafka_rdlock()
989
+ * @locality main thread
990
+ */
991
+ rd_buf_t *rd_kafka_telemetry_encode_metrics(rd_kafka_t *rk) {
992
+ rd_buf_t *rbuf = NULL;
993
+ rd_kafka_broker_t *rkb;
994
+ size_t message_size;
995
+ void *buffer = NULL;
996
+ pb_ostream_t stream;
997
+ bool status;
998
+ char **metric_names;
999
+ const int *metrics_to_encode = rk->rk_telemetry.matched_metrics;
1000
+ const size_t metrics_to_encode_count =
1001
+ rk->rk_telemetry.matched_metrics_cnt;
1002
+ const rd_kafka_telemetry_metric_info_t *info =
1003
+ RD_KAFKA_TELEMETRY_METRIC_INFO(rk);
1004
+ size_t total_metrics_count = metrics_to_encode_count;
1005
+ size_t i, metric_idx = 0;
1006
+
1007
+ if (!metrics_to_encode_count)
1008
+ return rd_buf_new(1, 1);
1009
+
1010
+ opentelemetry_proto_metrics_v1_MetricsData metrics_data =
1011
+ opentelemetry_proto_metrics_v1_MetricsData_init_zero;
1012
+
1013
+ opentelemetry_proto_metrics_v1_ResourceMetrics resource_metrics =
1014
+ opentelemetry_proto_metrics_v1_ResourceMetrics_init_zero;
1015
+
1016
+ opentelemetry_proto_metrics_v1_Metric **metrics;
1017
+ opentelemetry_proto_common_v1_KeyValue *
1018
+ *resource_attributes_key_values = NULL;
1019
+ opentelemetry_proto_common_v1_KeyValue
1020
+ *datapoint_attributes_key_values = NULL;
1021
+ opentelemetry_proto_metrics_v1_NumberDataPoint **data_points;
1022
+ rd_kafka_telemetry_metrics_repeated_t metrics_repeated;
1023
+ rd_kafka_telemetry_key_values_repeated_t resource_attributes_repeated;
1024
+ rd_kafka_telemetry_resource_attribute_t *resource_attributes_struct =
1025
+ NULL;
1026
+ rd_ts_t now_ns = rd_uclock() * 1000;
1027
+ rd_kafka_rdlock(rk);
1028
+
1029
+ for (i = 0; i < metrics_to_encode_count; i++) {
1030
+ if (info[metrics_to_encode[i]].is_per_broker) {
1031
+ total_metrics_count += rk->rk_broker_cnt.val - 1;
1032
+ }
1033
+ }
1034
+
1035
+ rd_kafka_dbg(rk, TELEMETRY, "PUSH", "Serializing metrics");
1036
+
1037
+ TAILQ_FOREACH(rkb, &rk->rk_brokers, rkb_link) {
1038
+ rd_avg_destroy(&rkb->rkb_telemetry.rd_avg_rollover.rkb_avg_rtt);
1039
+ rd_avg_rollover(&rkb->rkb_telemetry.rd_avg_rollover.rkb_avg_rtt,
1040
+ &rkb->rkb_telemetry.rd_avg_current.rkb_avg_rtt);
1041
+ rd_avg_destroy(
1042
+ &rkb->rkb_telemetry.rd_avg_rollover.rkb_avg_outbuf_latency);
1043
+ rd_avg_rollover(
1044
+ &rkb->rkb_telemetry.rd_avg_rollover.rkb_avg_outbuf_latency,
1045
+ &rkb->rkb_telemetry.rd_avg_current.rkb_avg_outbuf_latency);
1046
+ rd_avg_destroy(
1047
+ &rkb->rkb_telemetry.rd_avg_rollover.rkb_avg_throttle);
1048
+ rd_avg_rollover(
1049
+ &rkb->rkb_telemetry.rd_avg_rollover.rkb_avg_throttle,
1050
+ &rkb->rkb_telemetry.rd_avg_current.rkb_avg_throttle);
1051
+ if (rk->rk_type == RD_KAFKA_CONSUMER &&
1052
+ !RD_KAFKA_IS_SHARE_CONSUMER(rk)) {
1053
+ rd_avg_destroy(&rkb->rkb_telemetry.rd_avg_rollover
1054
+ .rkb_avg_fetch_latency);
1055
+ rd_avg_rollover(&rkb->rkb_telemetry.rd_avg_rollover
1056
+ .rkb_avg_fetch_latency,
1057
+ &rkb->rkb_telemetry.rd_avg_current
1058
+ .rkb_avg_fetch_latency);
1059
+ } else if (rk->rk_type == RD_KAFKA_PRODUCER) {
1060
+ rd_avg_destroy(&rkb->rkb_telemetry.rd_avg_rollover
1061
+ .rkb_avg_produce_latency);
1062
+ rd_avg_rollover(&rkb->rkb_telemetry.rd_avg_rollover
1063
+ .rkb_avg_produce_latency,
1064
+ &rkb->rkb_telemetry.rd_avg_current
1065
+ .rkb_avg_produce_latency);
1066
+ }
1067
+
1068
+ if (RD_KAFKA_IS_SHARE_CONSUMER(rk)) {
1069
+ rd_avg_destroy(&rkb->rkb_telemetry.rd_avg_rollover
1070
+ .rkb_avg_share_fetch_latency);
1071
+ rd_avg_rollover(&rkb->rkb_telemetry.rd_avg_rollover
1072
+ .rkb_avg_share_fetch_latency,
1073
+ &rkb->rkb_telemetry.rd_avg_current
1074
+ .rkb_avg_share_fetch_latency);
1075
+ rd_avg_destroy(&rkb->rkb_telemetry.rd_avg_rollover
1076
+ .rkb_avg_share_fetch_size);
1077
+ rd_avg_rollover(&rkb->rkb_telemetry.rd_avg_rollover
1078
+ .rkb_avg_share_fetch_size,
1079
+ &rkb->rkb_telemetry.rd_avg_current
1080
+ .rkb_avg_share_fetch_size);
1081
+ }
1082
+ }
1083
+
1084
+ if (rk->rk_type == RD_KAFKA_CONSUMER) {
1085
+ /* TODO: factor out a helper that performs the destroy +
1086
+ * rollover of a metric's rd_avg_rollover/rd_avg_current pair
1087
+ * in one call, to reduce the repetition below. */
1088
+ if (RD_KAFKA_IS_SHARE_CONSUMER(rk)) {
1089
+ rd_avg_destroy(&rk->rk_telemetry.rd_avg_rollover
1090
+ .rk_avg_share_poll_idle_ratio);
1091
+ rd_avg_rollover(&rk->rk_telemetry.rd_avg_rollover
1092
+ .rk_avg_share_poll_idle_ratio,
1093
+ &rk->rk_telemetry.rd_avg_current
1094
+ .rk_avg_share_poll_idle_ratio);
1095
+ rd_avg_destroy(&rk->rk_telemetry.rd_avg_rollover
1096
+ .rk_avg_share_time_between_poll);
1097
+ rd_avg_rollover(&rk->rk_telemetry.rd_avg_rollover
1098
+ .rk_avg_share_time_between_poll,
1099
+ &rk->rk_telemetry.rd_avg_current
1100
+ .rk_avg_share_time_between_poll);
1101
+ } else {
1102
+ rd_avg_destroy(&rk->rk_telemetry.rd_avg_rollover
1103
+ .rk_avg_poll_idle_ratio);
1104
+ rd_avg_rollover(&rk->rk_telemetry.rd_avg_rollover
1105
+ .rk_avg_poll_idle_ratio,
1106
+ &rk->rk_telemetry.rd_avg_current
1107
+ .rk_avg_poll_idle_ratio);
1108
+ rd_avg_destroy(&rk->rk_telemetry.rd_avg_rollover
1109
+ .rk_avg_rebalance_latency);
1110
+ rd_avg_rollover(&rk->rk_telemetry.rd_avg_rollover
1111
+ .rk_avg_rebalance_latency,
1112
+ &rk->rk_telemetry.rd_avg_current
1113
+ .rk_avg_rebalance_latency);
1114
+ rd_avg_destroy(&rk->rk_telemetry.rd_avg_rollover
1115
+ .rk_avg_commit_latency);
1116
+ rd_avg_rollover(&rk->rk_telemetry.rd_avg_rollover
1117
+ .rk_avg_commit_latency,
1118
+ &rk->rk_telemetry.rd_avg_current
1119
+ .rk_avg_commit_latency);
1120
+ }
1121
+ }
1122
+
1123
+ int resource_attributes_count =
1124
+ resource_attributes(rk, &resource_attributes_struct);
1125
+ rd_kafka_dbg(rk, TELEMETRY, "PUSH", "Resource attributes count: %d",
1126
+ resource_attributes_count);
1127
+ if (resource_attributes_count > 0) {
1128
+ resource_attributes_key_values =
1129
+ rd_malloc(sizeof(opentelemetry_proto_common_v1_KeyValue *) *
1130
+ resource_attributes_count);
1131
+ int ind;
1132
+ for (ind = 0; ind < resource_attributes_count; ++ind) {
1133
+ resource_attributes_key_values[ind] = rd_calloc(
1134
+ 1, sizeof(opentelemetry_proto_common_v1_KeyValue));
1135
+ resource_attributes_key_values[ind]->key.funcs.encode =
1136
+ &encode_string;
1137
+ resource_attributes_key_values[ind]->key.arg =
1138
+ (void *)resource_attributes_struct[ind].name;
1139
+
1140
+ resource_attributes_key_values[ind]->has_value = true;
1141
+ resource_attributes_key_values[ind]->value.which_value =
1142
+ opentelemetry_proto_common_v1_AnyValue_string_value_tag;
1143
+ resource_attributes_key_values[ind]
1144
+ ->value.value.string_value.funcs.encode =
1145
+ &encode_string;
1146
+ resource_attributes_key_values[ind]
1147
+ ->value.value.string_value.arg =
1148
+ (void *)resource_attributes_struct[ind].value;
1149
+ }
1150
+ resource_attributes_repeated.key_values =
1151
+ resource_attributes_key_values;
1152
+ resource_attributes_repeated.count = resource_attributes_count;
1153
+ resource_metrics.has_resource = true;
1154
+ resource_metrics.resource.attributes.funcs.encode =
1155
+ &encode_key_values;
1156
+ resource_metrics.resource.attributes.arg =
1157
+ &resource_attributes_repeated;
1158
+ }
1159
+
1160
+ opentelemetry_proto_metrics_v1_ScopeMetrics scope_metrics =
1161
+ opentelemetry_proto_metrics_v1_ScopeMetrics_init_zero;
1162
+
1163
+ opentelemetry_proto_common_v1_InstrumentationScope
1164
+ instrumentation_scope =
1165
+ opentelemetry_proto_common_v1_InstrumentationScope_init_zero;
1166
+ instrumentation_scope.name.funcs.encode = &encode_string;
1167
+ instrumentation_scope.name.arg = (void *)rd_kafka_name(rk);
1168
+ instrumentation_scope.version.funcs.encode = &encode_string;
1169
+ instrumentation_scope.version.arg = (void *)rd_kafka_version_str();
1170
+
1171
+ scope_metrics.has_scope = true;
1172
+ scope_metrics.scope = instrumentation_scope;
1173
+
1174
+ metrics = rd_malloc(sizeof(opentelemetry_proto_metrics_v1_Metric *) *
1175
+ total_metrics_count);
1176
+ data_points =
1177
+ rd_malloc(sizeof(opentelemetry_proto_metrics_v1_NumberDataPoint *) *
1178
+ total_metrics_count);
1179
+ datapoint_attributes_key_values =
1180
+ rd_malloc(sizeof(opentelemetry_proto_common_v1_KeyValue) *
1181
+ total_metrics_count);
1182
+ metric_names = rd_malloc(sizeof(char *) * total_metrics_count);
1183
+ rd_kafka_dbg(rk, TELEMETRY, "PUSH",
1184
+ "Total metrics to be encoded count: %" PRIusz,
1185
+ total_metrics_count);
1186
+
1187
+
1188
+ for (i = 0; i < metrics_to_encode_count; i++) {
1189
+
1190
+ rd_kafka_telemetry_metric_value_calculator_t
1191
+ metric_value_calculator;
1192
+ if (RD_KAFKA_IS_SHARE_CONSUMER(rk))
1193
+ metric_value_calculator =
1194
+ SHARE_CONSUMER_METRIC_VALUE_CALCULATORS
1195
+ [metrics_to_encode[i]];
1196
+ else if (rk->rk_type == RD_KAFKA_PRODUCER)
1197
+ metric_value_calculator =
1198
+ PRODUCER_METRIC_VALUE_CALCULATORS
1199
+ [metrics_to_encode[i]];
1200
+ else
1201
+ metric_value_calculator =
1202
+ CONSUMER_METRIC_VALUE_CALCULATORS
1203
+ [metrics_to_encode[i]];
1204
+ if (info[metrics_to_encode[i]].is_per_broker) {
1205
+ rd_kafka_broker_t *rkb;
1206
+
1207
+ TAILQ_FOREACH(rkb, &rk->rk_brokers, rkb_link) {
1208
+ metrics[metric_idx] = rd_calloc(
1209
+ 1,
1210
+ sizeof(
1211
+ opentelemetry_proto_metrics_v1_Metric));
1212
+ data_points[metric_idx] = rd_calloc(
1213
+ 1,
1214
+ sizeof(
1215
+ opentelemetry_proto_metrics_v1_NumberDataPoint));
1216
+ serialize_Metric(
1217
+ rk, rkb, &info[metrics_to_encode[i]],
1218
+ &metrics[metric_idx],
1219
+ &data_points[metric_idx],
1220
+ &datapoint_attributes_key_values
1221
+ [metric_idx],
1222
+ metric_value_calculator,
1223
+ &metric_names[metric_idx], true, now_ns);
1224
+ metric_idx++;
1225
+ }
1226
+ continue;
1227
+ }
1228
+
1229
+ metrics[metric_idx] =
1230
+ rd_calloc(1, sizeof(opentelemetry_proto_metrics_v1_Metric));
1231
+ data_points[metric_idx] = rd_calloc(
1232
+ 1, sizeof(opentelemetry_proto_metrics_v1_NumberDataPoint));
1233
+
1234
+ serialize_Metric(rk, NULL, &info[metrics_to_encode[i]],
1235
+ &metrics[metric_idx], &data_points[metric_idx],
1236
+ &datapoint_attributes_key_values[metric_idx],
1237
+ metric_value_calculator,
1238
+ &metric_names[metric_idx], false, now_ns);
1239
+ metric_idx++;
1240
+ }
1241
+
1242
+ /* Send empty metrics blob if no metrics are matched */
1243
+ if (total_metrics_count > 0) {
1244
+ metrics_repeated.metrics = metrics;
1245
+ metrics_repeated.count = total_metrics_count;
1246
+
1247
+ scope_metrics.metrics.funcs.encode = &encode_metric;
1248
+ scope_metrics.metrics.arg = &metrics_repeated;
1249
+
1250
+
1251
+ resource_metrics.scope_metrics.funcs.encode =
1252
+ &encode_scope_metrics;
1253
+ resource_metrics.scope_metrics.arg = &scope_metrics;
1254
+
1255
+ metrics_data.resource_metrics.funcs.encode =
1256
+ &encode_resource_metrics;
1257
+ metrics_data.resource_metrics.arg = &resource_metrics;
1258
+ }
1259
+
1260
+ status = pb_get_encoded_size(
1261
+ &message_size, opentelemetry_proto_metrics_v1_MetricsData_fields,
1262
+ &metrics_data);
1263
+ if (!status) {
1264
+ rd_kafka_dbg(rk, TELEMETRY, "PUSH",
1265
+ "Failed to get encoded size");
1266
+ goto fail;
1267
+ }
1268
+
1269
+ rbuf = rd_buf_new(1, message_size);
1270
+ rd_buf_write_ensure(rbuf, message_size, message_size);
1271
+ message_size = rd_buf_get_writable(rbuf, &buffer);
1272
+
1273
+ stream = pb_ostream_from_buffer(buffer, message_size);
1274
+ status = pb_encode(&stream,
1275
+ opentelemetry_proto_metrics_v1_MetricsData_fields,
1276
+ &metrics_data);
1277
+
1278
+ if (!status) {
1279
+ rd_kafka_dbg(rk, TELEMETRY, "PUSH", "Encoding failed: %s",
1280
+ PB_GET_ERROR(&stream));
1281
+ rd_buf_destroy_free(rbuf);
1282
+ goto fail;
1283
+ }
1284
+ rd_kafka_dbg(rk, TELEMETRY, "PUSH",
1285
+ "Push Telemetry metrics encoded, size: %" PRIusz,
1286
+ stream.bytes_written);
1287
+ rd_buf_write(rbuf, NULL, stream.bytes_written);
1288
+
1289
+ reset_historical_metrics(rk, now_ns);
1290
+
1291
+ free_metrics(metrics, metric_names, data_points,
1292
+ datapoint_attributes_key_values, total_metrics_count);
1293
+ free_resource_attributes(resource_attributes_key_values,
1294
+ resource_attributes_struct,
1295
+ resource_attributes_count);
1296
+ rd_kafka_rdunlock(rk);
1297
+
1298
+ return rbuf;
1299
+
1300
+ fail:
1301
+ free_metrics(metrics, metric_names, data_points,
1302
+ datapoint_attributes_key_values, total_metrics_count);
1303
+ free_resource_attributes(resource_attributes_key_values,
1304
+ resource_attributes_struct,
1305
+ resource_attributes_count);
1306
+ rd_kafka_rdunlock(rk);
1307
+
1308
+ return NULL;
1309
+ }