├── .github └── workflows │ └── ci.yml ├── .gitignore ├── .idea ├── .gitignore ├── modules.xml ├── streamgen.iml └── vcs.xml ├── Cargo.lock ├── Cargo.toml ├── LICENSE-APACHE ├── LICENSE-MIT ├── README.md ├── resources └── symbols.txt └── src ├── generators ├── common_log.rs ├── mod.rs └── schematized.rs ├── main.rs └── writers ├── kafka ├── mod.rs └── writer.rs ├── mod.rs ├── sse.rs └── stdout.rs /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: test suite 2 | on: [push, pull_request] 3 | 4 | jobs: 5 | test: 6 | name: cargo test 7 | runs-on: ubuntu-latest 8 | steps: 9 | - uses: actions/checkout@v4 10 | - uses: dtolnay/rust-toolchain@stable 11 | - run: cargo test --all-features 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | # Editor-based HTTP Client requests 5 | /httpRequests/ 6 | # Datasource local storage ignored files 7 | /dataSources/ 8 | /dataSources.local.xml 9 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/streamgen.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "addr2line" 7 | version = "0.21.0" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" 10 | dependencies = [ 11 | "gimli", 12 | ] 13 | 14 | [[package]] 15 | name = "adler" 16 | version = "1.0.2" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" 19 | 20 | [[package]] 21 | name = "aho-corasick" 22 | version = "1.1.2" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" 25 | dependencies = [ 26 | "memchr", 27 | ] 28 | 29 | [[package]] 30 | name = "android-tzdata" 31 | version = "0.1.1" 32 | source = "registry+https://github.com/rust-lang/crates.io-index" 33 | checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" 34 | 35 | [[package]] 36 | name = "android_system_properties" 37 | version = "0.1.5" 38 | source = "registry+https://github.com/rust-lang/crates.io-index" 39 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 40 | dependencies = [ 41 | "libc", 42 | ] 43 | 44 | [[package]] 45 | name = "anstream" 46 | version = "0.6.4" 47 | source = "registry+https://github.com/rust-lang/crates.io-index" 48 | checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44" 49 | dependencies = [ 50 | "anstyle", 51 | "anstyle-parse", 52 | "anstyle-query", 53 | "anstyle-wincon", 54 | "colorchoice", 55 | "utf8parse", 56 | ] 57 | 58 | [[package]] 59 | name = "anstyle" 60 | version = "1.0.4" 61 | source = "registry+https://github.com/rust-lang/crates.io-index" 62 | checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" 63 | 64 | [[package]] 65 | name = "anstyle-parse" 66 | version = "0.2.2" 67 | source = "registry+https://github.com/rust-lang/crates.io-index" 68 | checksum = "317b9a89c1868f5ea6ff1d9539a69f45dffc21ce321ac1fd1160dfa48c8e2140" 69 | dependencies = [ 70 | "utf8parse", 71 | ] 72 | 73 | [[package]] 74 | name = "anstyle-query" 75 | version = "1.0.0" 76 | source = "registry+https://github.com/rust-lang/crates.io-index" 77 | checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" 78 | dependencies = [ 79 | "windows-sys", 80 | ] 81 | 82 | [[package]] 83 | name = "anstyle-wincon" 84 | version = "3.0.1" 85 | source = "registry+https://github.com/rust-lang/crates.io-index" 86 | checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628" 87 | dependencies = [ 88 | "anstyle", 89 | "windows-sys", 90 | ] 91 | 92 | [[package]] 93 | name = "async-trait" 94 | version = "0.1.74" 95 | source = "registry+https://github.com/rust-lang/crates.io-index" 96 | checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" 97 | dependencies = [ 98 | "proc-macro2", 99 | "quote", 100 | "syn 2.0.39", 101 | ] 102 | 103 | [[package]] 104 | name = "autocfg" 105 | version = "1.1.0" 106 | source = "registry+https://github.com/rust-lang/crates.io-index" 107 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 108 | 109 | [[package]] 110 | name = "axum" 111 | version = "0.7.1" 112 | source = "registry+https://github.com/rust-lang/crates.io-index" 113 | checksum = "810a80b128d70e6ed2bdf3fe8ed72c0ae56f5f5948d01c2753282dd92a84fce8" 114 | dependencies = [ 115 | "async-trait", 116 | "axum-core", 117 | "bytes", 118 | "futures-util", 119 | "http 1.0.0", 120 | "http-body", 121 | "http-body-util", 122 | "hyper", 123 | "hyper-util", 124 | "itoa", 125 | "matchit", 126 | "memchr", 127 | "mime", 128 | "percent-encoding", 129 | "pin-project-lite", 130 | "rustversion", 131 | "serde", 132 | "serde_json", 133 | "serde_path_to_error", 134 | "serde_urlencoded", 135 | "sync_wrapper", 136 | "tokio", 137 | "tower", 138 | "tower-layer", 139 | "tower-service", 140 | ] 141 | 142 | [[package]] 143 | name = "axum-core" 144 | version = "0.4.0" 145 | source = "registry+https://github.com/rust-lang/crates.io-index" 146 | checksum = "de0ddc355eab88f4955090a823715df47acf0b7660aab7a69ad5ce6301ee3b73" 147 | dependencies = [ 148 | "async-trait", 149 | "bytes", 150 | "futures-util", 151 | "http 1.0.0", 152 | "http-body", 153 | "http-body-util", 154 | "mime", 155 | "pin-project-lite", 156 | "rustversion", 157 | "sync_wrapper", 158 | "tower-layer", 159 | "tower-service", 160 | ] 161 | 162 | [[package]] 163 | name = "axum-extra" 164 | version = "0.9.0" 165 | source = "registry+https://github.com/rust-lang/crates.io-index" 166 | checksum = "523ae92256049a3b02d3bb4df80152386cd97ddba0c8c5077619bdc8c4b1859b" 167 | dependencies = [ 168 | "axum", 169 | "axum-core", 170 | "bytes", 171 | "futures-util", 172 | "headers", 173 | "http 1.0.0", 174 | "http-body", 175 | "http-body-util", 176 | "mime", 177 | "pin-project-lite", 178 | "serde", 179 | "tower", 180 | "tower-layer", 181 | "tower-service", 182 | ] 183 | 184 | [[package]] 185 | name = "backtrace" 186 | version = "0.3.69" 187 | source = "registry+https://github.com/rust-lang/crates.io-index" 188 | checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" 189 | dependencies = [ 190 | "addr2line", 191 | "cc", 192 | "cfg-if", 193 | "libc", 194 | "miniz_oxide", 195 | "object", 196 | "rustc-demangle", 197 | ] 198 | 199 | [[package]] 200 | name = "base64" 201 | version = "0.21.5" 202 | source = "registry+https://github.com/rust-lang/crates.io-index" 203 | checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" 204 | 205 | [[package]] 206 | name = "bitflags" 207 | version = "1.3.2" 208 | source = "registry+https://github.com/rust-lang/crates.io-index" 209 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 210 | 211 | [[package]] 212 | name = "block-buffer" 213 | version = "0.10.4" 214 | source = "registry+https://github.com/rust-lang/crates.io-index" 215 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 216 | dependencies = [ 217 | "generic-array", 218 | ] 219 | 220 | [[package]] 221 | name = "bumpalo" 222 | version = "3.14.0" 223 | source = "registry+https://github.com/rust-lang/crates.io-index" 224 | checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" 225 | 226 | [[package]] 227 | name = "bytes" 228 | version = "1.5.0" 229 | source = "registry+https://github.com/rust-lang/crates.io-index" 230 | checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" 231 | 232 | [[package]] 233 | name = "cc" 234 | version = "1.0.83" 235 | source = "registry+https://github.com/rust-lang/crates.io-index" 236 | checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" 237 | dependencies = [ 238 | "libc", 239 | ] 240 | 241 | [[package]] 242 | name = "cfg-if" 243 | version = "1.0.0" 244 | source = "registry+https://github.com/rust-lang/crates.io-index" 245 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 246 | 247 | [[package]] 248 | name = "chrono" 249 | version = "0.4.31" 250 | source = "registry+https://github.com/rust-lang/crates.io-index" 251 | checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" 252 | dependencies = [ 253 | "android-tzdata", 254 | "iana-time-zone", 255 | "js-sys", 256 | "num-traits", 257 | "serde", 258 | "wasm-bindgen", 259 | "windows-targets", 260 | ] 261 | 262 | [[package]] 263 | name = "clap" 264 | version = "4.4.10" 265 | source = "registry+https://github.com/rust-lang/crates.io-index" 266 | checksum = "41fffed7514f420abec6d183b1d3acfd9099c79c3a10a06ade4f8203f1411272" 267 | dependencies = [ 268 | "clap_builder", 269 | "clap_derive", 270 | ] 271 | 272 | [[package]] 273 | name = "clap_builder" 274 | version = "4.4.9" 275 | source = "registry+https://github.com/rust-lang/crates.io-index" 276 | checksum = "63361bae7eef3771745f02d8d892bec2fee5f6e34af316ba556e7f97a7069ff1" 277 | dependencies = [ 278 | "anstream", 279 | "anstyle", 280 | "clap_lex", 281 | "strsim", 282 | ] 283 | 284 | [[package]] 285 | name = "clap_derive" 286 | version = "4.4.7" 287 | source = "registry+https://github.com/rust-lang/crates.io-index" 288 | checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" 289 | dependencies = [ 290 | "heck", 291 | "proc-macro2", 292 | "quote", 293 | "syn 2.0.39", 294 | ] 295 | 296 | [[package]] 297 | name = "clap_lex" 298 | version = "0.6.0" 299 | source = "registry+https://github.com/rust-lang/crates.io-index" 300 | checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" 301 | 302 | [[package]] 303 | name = "cmake" 304 | version = "0.1.50" 305 | source = "registry+https://github.com/rust-lang/crates.io-index" 306 | checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" 307 | dependencies = [ 308 | "cc", 309 | ] 310 | 311 | [[package]] 312 | name = "colorchoice" 313 | version = "1.0.0" 314 | source = "registry+https://github.com/rust-lang/crates.io-index" 315 | checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" 316 | 317 | [[package]] 318 | name = "core-foundation-sys" 319 | version = "0.8.4" 320 | source = "registry+https://github.com/rust-lang/crates.io-index" 321 | checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" 322 | 323 | [[package]] 324 | name = "cpufeatures" 325 | version = "0.2.11" 326 | source = "registry+https://github.com/rust-lang/crates.io-index" 327 | checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" 328 | dependencies = [ 329 | "libc", 330 | ] 331 | 332 | [[package]] 333 | name = "crypto-common" 334 | version = "0.1.6" 335 | source = "registry+https://github.com/rust-lang/crates.io-index" 336 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 337 | dependencies = [ 338 | "generic-array", 339 | "typenum", 340 | ] 341 | 342 | [[package]] 343 | name = "darling" 344 | version = "0.20.3" 345 | source = "registry+https://github.com/rust-lang/crates.io-index" 346 | checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" 347 | dependencies = [ 348 | "darling_core", 349 | "darling_macro", 350 | ] 351 | 352 | [[package]] 353 | name = "darling_core" 354 | version = "0.20.3" 355 | source = "registry+https://github.com/rust-lang/crates.io-index" 356 | checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" 357 | dependencies = [ 358 | "fnv", 359 | "ident_case", 360 | "proc-macro2", 361 | "quote", 362 | "strsim", 363 | "syn 2.0.39", 364 | ] 365 | 366 | [[package]] 367 | name = "darling_macro" 368 | version = "0.20.3" 369 | source = "registry+https://github.com/rust-lang/crates.io-index" 370 | checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" 371 | dependencies = [ 372 | "darling_core", 373 | "quote", 374 | "syn 2.0.39", 375 | ] 376 | 377 | [[package]] 378 | name = "deunicode" 379 | version = "1.4.1" 380 | source = "registry+https://github.com/rust-lang/crates.io-index" 381 | checksum = "6a1abaf4d861455be59f64fd2b55606cb151fce304ede7165f410243ce96bde6" 382 | 383 | [[package]] 384 | name = "digest" 385 | version = "0.10.7" 386 | source = "registry+https://github.com/rust-lang/crates.io-index" 387 | checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 388 | dependencies = [ 389 | "block-buffer", 390 | "crypto-common", 391 | ] 392 | 393 | [[package]] 394 | name = "dummy" 395 | version = "0.7.0" 396 | source = "registry+https://github.com/rust-lang/crates.io-index" 397 | checksum = "7e57e12b69e57fad516e01e2b3960f122696fdb13420e1a88ed8e210316f2876" 398 | dependencies = [ 399 | "darling", 400 | "proc-macro2", 401 | "quote", 402 | "syn 2.0.39", 403 | ] 404 | 405 | [[package]] 406 | name = "equivalent" 407 | version = "1.0.1" 408 | source = "registry+https://github.com/rust-lang/crates.io-index" 409 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 410 | 411 | [[package]] 412 | name = "fake" 413 | version = "2.9.1" 414 | source = "registry+https://github.com/rust-lang/crates.io-index" 415 | checksum = "26221445034074d46b276e13eb97a265ebdb8ed8da705c4dddd3dd20b66b45d2" 416 | dependencies = [ 417 | "deunicode", 418 | "dummy", 419 | "http 0.2.11", 420 | "rand", 421 | "url-escape", 422 | ] 423 | 424 | [[package]] 425 | name = "fnv" 426 | version = "1.0.7" 427 | source = "registry+https://github.com/rust-lang/crates.io-index" 428 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 429 | 430 | [[package]] 431 | name = "form_urlencoded" 432 | version = "1.2.1" 433 | source = "registry+https://github.com/rust-lang/crates.io-index" 434 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 435 | dependencies = [ 436 | "percent-encoding", 437 | ] 438 | 439 | [[package]] 440 | name = "futures-channel" 441 | version = "0.3.29" 442 | source = "registry+https://github.com/rust-lang/crates.io-index" 443 | checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" 444 | dependencies = [ 445 | "futures-core", 446 | ] 447 | 448 | [[package]] 449 | name = "futures-core" 450 | version = "0.3.29" 451 | source = "registry+https://github.com/rust-lang/crates.io-index" 452 | checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" 453 | 454 | [[package]] 455 | name = "futures-sink" 456 | version = "0.3.29" 457 | source = "registry+https://github.com/rust-lang/crates.io-index" 458 | checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" 459 | 460 | [[package]] 461 | name = "futures-task" 462 | version = "0.3.29" 463 | source = "registry+https://github.com/rust-lang/crates.io-index" 464 | checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" 465 | 466 | [[package]] 467 | name = "futures-util" 468 | version = "0.3.29" 469 | source = "registry+https://github.com/rust-lang/crates.io-index" 470 | checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" 471 | dependencies = [ 472 | "futures-core", 473 | "futures-task", 474 | "pin-project-lite", 475 | "pin-utils", 476 | ] 477 | 478 | [[package]] 479 | name = "generic-array" 480 | version = "0.14.7" 481 | source = "registry+https://github.com/rust-lang/crates.io-index" 482 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 483 | dependencies = [ 484 | "typenum", 485 | "version_check", 486 | ] 487 | 488 | [[package]] 489 | name = "getrandom" 490 | version = "0.2.11" 491 | source = "registry+https://github.com/rust-lang/crates.io-index" 492 | checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" 493 | dependencies = [ 494 | "cfg-if", 495 | "libc", 496 | "wasi", 497 | ] 498 | 499 | [[package]] 500 | name = "gimli" 501 | version = "0.28.1" 502 | source = "registry+https://github.com/rust-lang/crates.io-index" 503 | checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" 504 | 505 | [[package]] 506 | name = "h2" 507 | version = "0.4.0" 508 | source = "registry+https://github.com/rust-lang/crates.io-index" 509 | checksum = "e1d308f63daf4181410c242d34c11f928dcb3aa105852019e043c9d1f4e4368a" 510 | dependencies = [ 511 | "bytes", 512 | "fnv", 513 | "futures-core", 514 | "futures-sink", 515 | "futures-util", 516 | "http 1.0.0", 517 | "indexmap", 518 | "slab", 519 | "tokio", 520 | "tokio-util", 521 | "tracing", 522 | ] 523 | 524 | [[package]] 525 | name = "hashbrown" 526 | version = "0.14.3" 527 | source = "registry+https://github.com/rust-lang/crates.io-index" 528 | checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" 529 | 530 | [[package]] 531 | name = "headers" 532 | version = "0.4.0" 533 | source = "registry+https://github.com/rust-lang/crates.io-index" 534 | checksum = "322106e6bd0cba2d5ead589ddb8150a13d7c4217cf80d7c4f682ca994ccc6aa9" 535 | dependencies = [ 536 | "base64", 537 | "bytes", 538 | "headers-core", 539 | "http 1.0.0", 540 | "httpdate", 541 | "mime", 542 | "sha1", 543 | ] 544 | 545 | [[package]] 546 | name = "headers-core" 547 | version = "0.3.0" 548 | source = "registry+https://github.com/rust-lang/crates.io-index" 549 | checksum = "54b4a22553d4242c49fddb9ba998a99962b5cc6f22cb5a3482bec22522403ce4" 550 | dependencies = [ 551 | "http 1.0.0", 552 | ] 553 | 554 | [[package]] 555 | name = "heck" 556 | version = "0.4.1" 557 | source = "registry+https://github.com/rust-lang/crates.io-index" 558 | checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" 559 | 560 | [[package]] 561 | name = "hermit-abi" 562 | version = "0.3.3" 563 | source = "registry+https://github.com/rust-lang/crates.io-index" 564 | checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" 565 | 566 | [[package]] 567 | name = "http" 568 | version = "0.2.11" 569 | source = "registry+https://github.com/rust-lang/crates.io-index" 570 | checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" 571 | dependencies = [ 572 | "bytes", 573 | "fnv", 574 | "itoa", 575 | ] 576 | 577 | [[package]] 578 | name = "http" 579 | version = "1.0.0" 580 | source = "registry+https://github.com/rust-lang/crates.io-index" 581 | checksum = "b32afd38673a8016f7c9ae69e5af41a58f81b1d31689040f2f1959594ce194ea" 582 | dependencies = [ 583 | "bytes", 584 | "fnv", 585 | "itoa", 586 | ] 587 | 588 | [[package]] 589 | name = "http-body" 590 | version = "1.0.0" 591 | source = "registry+https://github.com/rust-lang/crates.io-index" 592 | checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" 593 | dependencies = [ 594 | "bytes", 595 | "http 1.0.0", 596 | ] 597 | 598 | [[package]] 599 | name = "http-body-util" 600 | version = "0.1.0" 601 | source = "registry+https://github.com/rust-lang/crates.io-index" 602 | checksum = "41cb79eb393015dadd30fc252023adb0b2400a0caee0fa2a077e6e21a551e840" 603 | dependencies = [ 604 | "bytes", 605 | "futures-util", 606 | "http 1.0.0", 607 | "http-body", 608 | "pin-project-lite", 609 | ] 610 | 611 | [[package]] 612 | name = "httparse" 613 | version = "1.8.0" 614 | source = "registry+https://github.com/rust-lang/crates.io-index" 615 | checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" 616 | 617 | [[package]] 618 | name = "httpdate" 619 | version = "1.0.3" 620 | source = "registry+https://github.com/rust-lang/crates.io-index" 621 | checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" 622 | 623 | [[package]] 624 | name = "hyper" 625 | version = "1.0.1" 626 | source = "registry+https://github.com/rust-lang/crates.io-index" 627 | checksum = "403f9214f3e703236b221f1a9cd88ec8b4adfa5296de01ab96216361f4692f56" 628 | dependencies = [ 629 | "bytes", 630 | "futures-channel", 631 | "futures-util", 632 | "h2", 633 | "http 1.0.0", 634 | "http-body", 635 | "httparse", 636 | "httpdate", 637 | "itoa", 638 | "pin-project-lite", 639 | "tokio", 640 | ] 641 | 642 | [[package]] 643 | name = "hyper-util" 644 | version = "0.1.1" 645 | source = "registry+https://github.com/rust-lang/crates.io-index" 646 | checksum = "9ca339002caeb0d159cc6e023dff48e199f081e42fa039895c7c6f38b37f2e9d" 647 | dependencies = [ 648 | "bytes", 649 | "futures-channel", 650 | "futures-util", 651 | "http 1.0.0", 652 | "http-body", 653 | "hyper", 654 | "pin-project-lite", 655 | "socket2", 656 | "tokio", 657 | "tower", 658 | "tower-service", 659 | "tracing", 660 | ] 661 | 662 | [[package]] 663 | name = "iana-time-zone" 664 | version = "0.1.58" 665 | source = "registry+https://github.com/rust-lang/crates.io-index" 666 | checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20" 667 | dependencies = [ 668 | "android_system_properties", 669 | "core-foundation-sys", 670 | "iana-time-zone-haiku", 671 | "js-sys", 672 | "wasm-bindgen", 673 | "windows-core", 674 | ] 675 | 676 | [[package]] 677 | name = "iana-time-zone-haiku" 678 | version = "0.1.2" 679 | source = "registry+https://github.com/rust-lang/crates.io-index" 680 | checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" 681 | dependencies = [ 682 | "cc", 683 | ] 684 | 685 | [[package]] 686 | name = "ident_case" 687 | version = "1.0.1" 688 | source = "registry+https://github.com/rust-lang/crates.io-index" 689 | checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" 690 | 691 | [[package]] 692 | name = "indexmap" 693 | version = "2.1.0" 694 | source = "registry+https://github.com/rust-lang/crates.io-index" 695 | checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" 696 | dependencies = [ 697 | "equivalent", 698 | "hashbrown", 699 | ] 700 | 701 | [[package]] 702 | name = "itoa" 703 | version = "1.0.9" 704 | source = "registry+https://github.com/rust-lang/crates.io-index" 705 | checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" 706 | 707 | [[package]] 708 | name = "js-sys" 709 | version = "0.3.66" 710 | source = "registry+https://github.com/rust-lang/crates.io-index" 711 | checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" 712 | dependencies = [ 713 | "wasm-bindgen", 714 | ] 715 | 716 | [[package]] 717 | name = "lazy_static" 718 | version = "1.4.0" 719 | source = "registry+https://github.com/rust-lang/crates.io-index" 720 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 721 | 722 | [[package]] 723 | name = "libc" 724 | version = "0.2.150" 725 | source = "registry+https://github.com/rust-lang/crates.io-index" 726 | checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" 727 | 728 | [[package]] 729 | name = "libz-sys" 730 | version = "1.1.12" 731 | source = "registry+https://github.com/rust-lang/crates.io-index" 732 | checksum = "d97137b25e321a73eef1418d1d5d2eda4d77e12813f8e6dead84bc52c5870a7b" 733 | dependencies = [ 734 | "cc", 735 | "libc", 736 | "pkg-config", 737 | "vcpkg", 738 | ] 739 | 740 | [[package]] 741 | name = "lock_api" 742 | version = "0.4.11" 743 | source = "registry+https://github.com/rust-lang/crates.io-index" 744 | checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" 745 | dependencies = [ 746 | "autocfg", 747 | "scopeguard", 748 | ] 749 | 750 | [[package]] 751 | name = "log" 752 | version = "0.4.20" 753 | source = "registry+https://github.com/rust-lang/crates.io-index" 754 | checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" 755 | 756 | [[package]] 757 | name = "matchers" 758 | version = "0.1.0" 759 | source = "registry+https://github.com/rust-lang/crates.io-index" 760 | checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" 761 | dependencies = [ 762 | "regex-automata 0.1.10", 763 | ] 764 | 765 | [[package]] 766 | name = "matchit" 767 | version = "0.7.3" 768 | source = "registry+https://github.com/rust-lang/crates.io-index" 769 | checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" 770 | 771 | [[package]] 772 | name = "memchr" 773 | version = "2.6.4" 774 | source = "registry+https://github.com/rust-lang/crates.io-index" 775 | checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" 776 | 777 | [[package]] 778 | name = "mime" 779 | version = "0.3.17" 780 | source = "registry+https://github.com/rust-lang/crates.io-index" 781 | checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 782 | 783 | [[package]] 784 | name = "miniz_oxide" 785 | version = "0.7.1" 786 | source = "registry+https://github.com/rust-lang/crates.io-index" 787 | checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" 788 | dependencies = [ 789 | "adler", 790 | ] 791 | 792 | [[package]] 793 | name = "mio" 794 | version = "0.8.9" 795 | source = "registry+https://github.com/rust-lang/crates.io-index" 796 | checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" 797 | dependencies = [ 798 | "libc", 799 | "wasi", 800 | "windows-sys", 801 | ] 802 | 803 | [[package]] 804 | name = "nu-ansi-term" 805 | version = "0.46.0" 806 | source = "registry+https://github.com/rust-lang/crates.io-index" 807 | checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" 808 | dependencies = [ 809 | "overload", 810 | "winapi", 811 | ] 812 | 813 | [[package]] 814 | name = "num-traits" 815 | version = "0.2.17" 816 | source = "registry+https://github.com/rust-lang/crates.io-index" 817 | checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" 818 | dependencies = [ 819 | "autocfg", 820 | ] 821 | 822 | [[package]] 823 | name = "num_cpus" 824 | version = "1.16.0" 825 | source = "registry+https://github.com/rust-lang/crates.io-index" 826 | checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" 827 | dependencies = [ 828 | "hermit-abi", 829 | "libc", 830 | ] 831 | 832 | [[package]] 833 | name = "num_enum" 834 | version = "0.5.11" 835 | source = "registry+https://github.com/rust-lang/crates.io-index" 836 | checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" 837 | dependencies = [ 838 | "num_enum_derive", 839 | ] 840 | 841 | [[package]] 842 | name = "num_enum_derive" 843 | version = "0.5.11" 844 | source = "registry+https://github.com/rust-lang/crates.io-index" 845 | checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" 846 | dependencies = [ 847 | "proc-macro-crate", 848 | "proc-macro2", 849 | "quote", 850 | "syn 1.0.109", 851 | ] 852 | 853 | [[package]] 854 | name = "object" 855 | version = "0.32.1" 856 | source = "registry+https://github.com/rust-lang/crates.io-index" 857 | checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" 858 | dependencies = [ 859 | "memchr", 860 | ] 861 | 862 | [[package]] 863 | name = "once_cell" 864 | version = "1.18.0" 865 | source = "registry+https://github.com/rust-lang/crates.io-index" 866 | checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" 867 | 868 | [[package]] 869 | name = "overload" 870 | version = "0.1.1" 871 | source = "registry+https://github.com/rust-lang/crates.io-index" 872 | checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" 873 | 874 | [[package]] 875 | name = "parking_lot" 876 | version = "0.12.1" 877 | source = "registry+https://github.com/rust-lang/crates.io-index" 878 | checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" 879 | dependencies = [ 880 | "lock_api", 881 | "parking_lot_core", 882 | ] 883 | 884 | [[package]] 885 | name = "parking_lot_core" 886 | version = "0.9.9" 887 | source = "registry+https://github.com/rust-lang/crates.io-index" 888 | checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" 889 | dependencies = [ 890 | "cfg-if", 891 | "libc", 892 | "redox_syscall", 893 | "smallvec", 894 | "windows-targets", 895 | ] 896 | 897 | [[package]] 898 | name = "percent-encoding" 899 | version = "2.3.1" 900 | source = "registry+https://github.com/rust-lang/crates.io-index" 901 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 902 | 903 | [[package]] 904 | name = "pin-project" 905 | version = "1.1.3" 906 | source = "registry+https://github.com/rust-lang/crates.io-index" 907 | checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" 908 | dependencies = [ 909 | "pin-project-internal", 910 | ] 911 | 912 | [[package]] 913 | name = "pin-project-internal" 914 | version = "1.1.3" 915 | source = "registry+https://github.com/rust-lang/crates.io-index" 916 | checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" 917 | dependencies = [ 918 | "proc-macro2", 919 | "quote", 920 | "syn 2.0.39", 921 | ] 922 | 923 | [[package]] 924 | name = "pin-project-lite" 925 | version = "0.2.13" 926 | source = "registry+https://github.com/rust-lang/crates.io-index" 927 | checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" 928 | 929 | [[package]] 930 | name = "pin-utils" 931 | version = "0.1.0" 932 | source = "registry+https://github.com/rust-lang/crates.io-index" 933 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 934 | 935 | [[package]] 936 | name = "pkg-config" 937 | version = "0.3.27" 938 | source = "registry+https://github.com/rust-lang/crates.io-index" 939 | checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" 940 | 941 | [[package]] 942 | name = "ppv-lite86" 943 | version = "0.2.17" 944 | source = "registry+https://github.com/rust-lang/crates.io-index" 945 | checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" 946 | 947 | [[package]] 948 | name = "proc-macro-crate" 949 | version = "1.3.1" 950 | source = "registry+https://github.com/rust-lang/crates.io-index" 951 | checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" 952 | dependencies = [ 953 | "once_cell", 954 | "toml_edit", 955 | ] 956 | 957 | [[package]] 958 | name = "proc-macro2" 959 | version = "1.0.70" 960 | source = "registry+https://github.com/rust-lang/crates.io-index" 961 | checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" 962 | dependencies = [ 963 | "unicode-ident", 964 | ] 965 | 966 | [[package]] 967 | name = "quote" 968 | version = "1.0.33" 969 | source = "registry+https://github.com/rust-lang/crates.io-index" 970 | checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" 971 | dependencies = [ 972 | "proc-macro2", 973 | ] 974 | 975 | [[package]] 976 | name = "rand" 977 | version = "0.8.5" 978 | source = "registry+https://github.com/rust-lang/crates.io-index" 979 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 980 | dependencies = [ 981 | "libc", 982 | "rand_chacha", 983 | "rand_core", 984 | ] 985 | 986 | [[package]] 987 | name = "rand_chacha" 988 | version = "0.3.1" 989 | source = "registry+https://github.com/rust-lang/crates.io-index" 990 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 991 | dependencies = [ 992 | "ppv-lite86", 993 | "rand_core", 994 | ] 995 | 996 | [[package]] 997 | name = "rand_core" 998 | version = "0.6.4" 999 | source = "registry+https://github.com/rust-lang/crates.io-index" 1000 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1001 | dependencies = [ 1002 | "getrandom", 1003 | ] 1004 | 1005 | [[package]] 1006 | name = "rdkafka" 1007 | version = "0.36.0" 1008 | source = "registry+https://github.com/rust-lang/crates.io-index" 1009 | checksum = "d54f02a5a40220f8a2dfa47ddb38ba9064475a5807a69504b6f91711df2eea63" 1010 | dependencies = [ 1011 | "futures-channel", 1012 | "futures-util", 1013 | "libc", 1014 | "log", 1015 | "rdkafka-sys", 1016 | "serde", 1017 | "serde_derive", 1018 | "serde_json", 1019 | "slab", 1020 | "tokio", 1021 | ] 1022 | 1023 | [[package]] 1024 | name = "rdkafka-sys" 1025 | version = "4.7.0+2.3.0" 1026 | source = "registry+https://github.com/rust-lang/crates.io-index" 1027 | checksum = "55e0d2f9ba6253f6ec72385e453294f8618e9e15c2c6aba2a5c01ccf9622d615" 1028 | dependencies = [ 1029 | "cmake", 1030 | "libc", 1031 | "libz-sys", 1032 | "num_enum", 1033 | "pkg-config", 1034 | ] 1035 | 1036 | [[package]] 1037 | name = "redox_syscall" 1038 | version = "0.4.1" 1039 | source = "registry+https://github.com/rust-lang/crates.io-index" 1040 | checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" 1041 | dependencies = [ 1042 | "bitflags", 1043 | ] 1044 | 1045 | [[package]] 1046 | name = "regex" 1047 | version = "1.10.2" 1048 | source = "registry+https://github.com/rust-lang/crates.io-index" 1049 | checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" 1050 | dependencies = [ 1051 | "aho-corasick", 1052 | "memchr", 1053 | "regex-automata 0.4.3", 1054 | "regex-syntax 0.8.2", 1055 | ] 1056 | 1057 | [[package]] 1058 | name = "regex-automata" 1059 | version = "0.1.10" 1060 | source = "registry+https://github.com/rust-lang/crates.io-index" 1061 | checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" 1062 | dependencies = [ 1063 | "regex-syntax 0.6.29", 1064 | ] 1065 | 1066 | [[package]] 1067 | name = "regex-automata" 1068 | version = "0.4.3" 1069 | source = "registry+https://github.com/rust-lang/crates.io-index" 1070 | checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" 1071 | dependencies = [ 1072 | "aho-corasick", 1073 | "memchr", 1074 | "regex-syntax 0.8.2", 1075 | ] 1076 | 1077 | [[package]] 1078 | name = "regex-syntax" 1079 | version = "0.6.29" 1080 | source = "registry+https://github.com/rust-lang/crates.io-index" 1081 | checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" 1082 | 1083 | [[package]] 1084 | name = "regex-syntax" 1085 | version = "0.8.2" 1086 | source = "registry+https://github.com/rust-lang/crates.io-index" 1087 | checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" 1088 | 1089 | [[package]] 1090 | name = "rustc-demangle" 1091 | version = "0.1.23" 1092 | source = "registry+https://github.com/rust-lang/crates.io-index" 1093 | checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" 1094 | 1095 | [[package]] 1096 | name = "rustversion" 1097 | version = "1.0.14" 1098 | source = "registry+https://github.com/rust-lang/crates.io-index" 1099 | checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" 1100 | 1101 | [[package]] 1102 | name = "ryu" 1103 | version = "1.0.15" 1104 | source = "registry+https://github.com/rust-lang/crates.io-index" 1105 | checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" 1106 | 1107 | [[package]] 1108 | name = "scopeguard" 1109 | version = "1.2.0" 1110 | source = "registry+https://github.com/rust-lang/crates.io-index" 1111 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 1112 | 1113 | [[package]] 1114 | name = "serde" 1115 | version = "1.0.193" 1116 | source = "registry+https://github.com/rust-lang/crates.io-index" 1117 | checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" 1118 | dependencies = [ 1119 | "serde_derive", 1120 | ] 1121 | 1122 | [[package]] 1123 | name = "serde_derive" 1124 | version = "1.0.193" 1125 | source = "registry+https://github.com/rust-lang/crates.io-index" 1126 | checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" 1127 | dependencies = [ 1128 | "proc-macro2", 1129 | "quote", 1130 | "syn 2.0.39", 1131 | ] 1132 | 1133 | [[package]] 1134 | name = "serde_json" 1135 | version = "1.0.108" 1136 | source = "registry+https://github.com/rust-lang/crates.io-index" 1137 | checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" 1138 | dependencies = [ 1139 | "itoa", 1140 | "ryu", 1141 | "serde", 1142 | ] 1143 | 1144 | [[package]] 1145 | name = "serde_path_to_error" 1146 | version = "0.1.14" 1147 | source = "registry+https://github.com/rust-lang/crates.io-index" 1148 | checksum = "4beec8bce849d58d06238cb50db2e1c417cfeafa4c63f692b15c82b7c80f8335" 1149 | dependencies = [ 1150 | "itoa", 1151 | "serde", 1152 | ] 1153 | 1154 | [[package]] 1155 | name = "serde_urlencoded" 1156 | version = "0.7.1" 1157 | source = "registry+https://github.com/rust-lang/crates.io-index" 1158 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 1159 | dependencies = [ 1160 | "form_urlencoded", 1161 | "itoa", 1162 | "ryu", 1163 | "serde", 1164 | ] 1165 | 1166 | [[package]] 1167 | name = "sha1" 1168 | version = "0.10.6" 1169 | source = "registry+https://github.com/rust-lang/crates.io-index" 1170 | checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" 1171 | dependencies = [ 1172 | "cfg-if", 1173 | "cpufeatures", 1174 | "digest", 1175 | ] 1176 | 1177 | [[package]] 1178 | name = "sharded-slab" 1179 | version = "0.1.7" 1180 | source = "registry+https://github.com/rust-lang/crates.io-index" 1181 | checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" 1182 | dependencies = [ 1183 | "lazy_static", 1184 | ] 1185 | 1186 | [[package]] 1187 | name = "signal-hook-registry" 1188 | version = "1.4.1" 1189 | source = "registry+https://github.com/rust-lang/crates.io-index" 1190 | checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" 1191 | dependencies = [ 1192 | "libc", 1193 | ] 1194 | 1195 | [[package]] 1196 | name = "slab" 1197 | version = "0.4.9" 1198 | source = "registry+https://github.com/rust-lang/crates.io-index" 1199 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 1200 | dependencies = [ 1201 | "autocfg", 1202 | ] 1203 | 1204 | [[package]] 1205 | name = "smallvec" 1206 | version = "1.11.2" 1207 | source = "registry+https://github.com/rust-lang/crates.io-index" 1208 | checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" 1209 | 1210 | [[package]] 1211 | name = "socket2" 1212 | version = "0.5.5" 1213 | source = "registry+https://github.com/rust-lang/crates.io-index" 1214 | checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" 1215 | dependencies = [ 1216 | "libc", 1217 | "windows-sys", 1218 | ] 1219 | 1220 | [[package]] 1221 | name = "streamgen" 1222 | version = "0.1.0" 1223 | dependencies = [ 1224 | "async-trait", 1225 | "axum", 1226 | "axum-extra", 1227 | "chrono", 1228 | "clap", 1229 | "fake", 1230 | "headers", 1231 | "http 1.0.0", 1232 | "rand", 1233 | "rdkafka", 1234 | "serde", 1235 | "serde_json", 1236 | "tokio", 1237 | "tokio-stream", 1238 | "tracing", 1239 | "tracing-subscriber", 1240 | "uuid", 1241 | ] 1242 | 1243 | [[package]] 1244 | name = "strsim" 1245 | version = "0.10.0" 1246 | source = "registry+https://github.com/rust-lang/crates.io-index" 1247 | checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" 1248 | 1249 | [[package]] 1250 | name = "syn" 1251 | version = "1.0.109" 1252 | source = "registry+https://github.com/rust-lang/crates.io-index" 1253 | checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 1254 | dependencies = [ 1255 | "proc-macro2", 1256 | "quote", 1257 | "unicode-ident", 1258 | ] 1259 | 1260 | [[package]] 1261 | name = "syn" 1262 | version = "2.0.39" 1263 | source = "registry+https://github.com/rust-lang/crates.io-index" 1264 | checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" 1265 | dependencies = [ 1266 | "proc-macro2", 1267 | "quote", 1268 | "unicode-ident", 1269 | ] 1270 | 1271 | [[package]] 1272 | name = "sync_wrapper" 1273 | version = "0.1.2" 1274 | source = "registry+https://github.com/rust-lang/crates.io-index" 1275 | checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" 1276 | 1277 | [[package]] 1278 | name = "thread_local" 1279 | version = "1.1.7" 1280 | source = "registry+https://github.com/rust-lang/crates.io-index" 1281 | checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" 1282 | dependencies = [ 1283 | "cfg-if", 1284 | "once_cell", 1285 | ] 1286 | 1287 | [[package]] 1288 | name = "tokio" 1289 | version = "1.34.0" 1290 | source = "registry+https://github.com/rust-lang/crates.io-index" 1291 | checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9" 1292 | dependencies = [ 1293 | "backtrace", 1294 | "bytes", 1295 | "libc", 1296 | "mio", 1297 | "num_cpus", 1298 | "parking_lot", 1299 | "pin-project-lite", 1300 | "signal-hook-registry", 1301 | "socket2", 1302 | "tokio-macros", 1303 | "windows-sys", 1304 | ] 1305 | 1306 | [[package]] 1307 | name = "tokio-macros" 1308 | version = "2.2.0" 1309 | source = "registry+https://github.com/rust-lang/crates.io-index" 1310 | checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" 1311 | dependencies = [ 1312 | "proc-macro2", 1313 | "quote", 1314 | "syn 2.0.39", 1315 | ] 1316 | 1317 | [[package]] 1318 | name = "tokio-stream" 1319 | version = "0.1.14" 1320 | source = "registry+https://github.com/rust-lang/crates.io-index" 1321 | checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" 1322 | dependencies = [ 1323 | "futures-core", 1324 | "pin-project-lite", 1325 | "tokio", 1326 | "tokio-util", 1327 | ] 1328 | 1329 | [[package]] 1330 | name = "tokio-util" 1331 | version = "0.7.10" 1332 | source = "registry+https://github.com/rust-lang/crates.io-index" 1333 | checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" 1334 | dependencies = [ 1335 | "bytes", 1336 | "futures-core", 1337 | "futures-sink", 1338 | "pin-project-lite", 1339 | "tokio", 1340 | "tracing", 1341 | ] 1342 | 1343 | [[package]] 1344 | name = "toml_datetime" 1345 | version = "0.6.5" 1346 | source = "registry+https://github.com/rust-lang/crates.io-index" 1347 | checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" 1348 | 1349 | [[package]] 1350 | name = "toml_edit" 1351 | version = "0.19.15" 1352 | source = "registry+https://github.com/rust-lang/crates.io-index" 1353 | checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" 1354 | dependencies = [ 1355 | "indexmap", 1356 | "toml_datetime", 1357 | "winnow", 1358 | ] 1359 | 1360 | [[package]] 1361 | name = "tower" 1362 | version = "0.4.13" 1363 | source = "registry+https://github.com/rust-lang/crates.io-index" 1364 | checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" 1365 | dependencies = [ 1366 | "futures-core", 1367 | "futures-util", 1368 | "pin-project", 1369 | "pin-project-lite", 1370 | "tokio", 1371 | "tower-layer", 1372 | "tower-service", 1373 | "tracing", 1374 | ] 1375 | 1376 | [[package]] 1377 | name = "tower-layer" 1378 | version = "0.3.2" 1379 | source = "registry+https://github.com/rust-lang/crates.io-index" 1380 | checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" 1381 | 1382 | [[package]] 1383 | name = "tower-service" 1384 | version = "0.3.2" 1385 | source = "registry+https://github.com/rust-lang/crates.io-index" 1386 | checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" 1387 | 1388 | [[package]] 1389 | name = "tracing" 1390 | version = "0.1.40" 1391 | source = "registry+https://github.com/rust-lang/crates.io-index" 1392 | checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" 1393 | dependencies = [ 1394 | "log", 1395 | "pin-project-lite", 1396 | "tracing-attributes", 1397 | "tracing-core", 1398 | ] 1399 | 1400 | [[package]] 1401 | name = "tracing-attributes" 1402 | version = "0.1.27" 1403 | source = "registry+https://github.com/rust-lang/crates.io-index" 1404 | checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" 1405 | dependencies = [ 1406 | "proc-macro2", 1407 | "quote", 1408 | "syn 2.0.39", 1409 | ] 1410 | 1411 | [[package]] 1412 | name = "tracing-core" 1413 | version = "0.1.32" 1414 | source = "registry+https://github.com/rust-lang/crates.io-index" 1415 | checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" 1416 | dependencies = [ 1417 | "once_cell", 1418 | "valuable", 1419 | ] 1420 | 1421 | [[package]] 1422 | name = "tracing-log" 1423 | version = "0.2.0" 1424 | source = "registry+https://github.com/rust-lang/crates.io-index" 1425 | checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" 1426 | dependencies = [ 1427 | "log", 1428 | "once_cell", 1429 | "tracing-core", 1430 | ] 1431 | 1432 | [[package]] 1433 | name = "tracing-subscriber" 1434 | version = "0.3.18" 1435 | source = "registry+https://github.com/rust-lang/crates.io-index" 1436 | checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" 1437 | dependencies = [ 1438 | "matchers", 1439 | "nu-ansi-term", 1440 | "once_cell", 1441 | "regex", 1442 | "sharded-slab", 1443 | "smallvec", 1444 | "thread_local", 1445 | "tracing", 1446 | "tracing-core", 1447 | "tracing-log", 1448 | ] 1449 | 1450 | [[package]] 1451 | name = "typenum" 1452 | version = "1.17.0" 1453 | source = "registry+https://github.com/rust-lang/crates.io-index" 1454 | checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" 1455 | 1456 | [[package]] 1457 | name = "unicode-ident" 1458 | version = "1.0.12" 1459 | source = "registry+https://github.com/rust-lang/crates.io-index" 1460 | checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" 1461 | 1462 | [[package]] 1463 | name = "url-escape" 1464 | version = "0.1.1" 1465 | source = "registry+https://github.com/rust-lang/crates.io-index" 1466 | checksum = "44e0ce4d1246d075ca5abec4b41d33e87a6054d08e2366b63205665e950db218" 1467 | dependencies = [ 1468 | "percent-encoding", 1469 | ] 1470 | 1471 | [[package]] 1472 | name = "utf8parse" 1473 | version = "0.2.1" 1474 | source = "registry+https://github.com/rust-lang/crates.io-index" 1475 | checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" 1476 | 1477 | [[package]] 1478 | name = "uuid" 1479 | version = "1.6.1" 1480 | source = "registry+https://github.com/rust-lang/crates.io-index" 1481 | checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" 1482 | dependencies = [ 1483 | "getrandom", 1484 | ] 1485 | 1486 | [[package]] 1487 | name = "valuable" 1488 | version = "0.1.0" 1489 | source = "registry+https://github.com/rust-lang/crates.io-index" 1490 | checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" 1491 | 1492 | [[package]] 1493 | name = "vcpkg" 1494 | version = "0.2.15" 1495 | source = "registry+https://github.com/rust-lang/crates.io-index" 1496 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 1497 | 1498 | [[package]] 1499 | name = "version_check" 1500 | version = "0.9.4" 1501 | source = "registry+https://github.com/rust-lang/crates.io-index" 1502 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 1503 | 1504 | [[package]] 1505 | name = "wasi" 1506 | version = "0.11.0+wasi-snapshot-preview1" 1507 | source = "registry+https://github.com/rust-lang/crates.io-index" 1508 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 1509 | 1510 | [[package]] 1511 | name = "wasm-bindgen" 1512 | version = "0.2.89" 1513 | source = "registry+https://github.com/rust-lang/crates.io-index" 1514 | checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" 1515 | dependencies = [ 1516 | "cfg-if", 1517 | "wasm-bindgen-macro", 1518 | ] 1519 | 1520 | [[package]] 1521 | name = "wasm-bindgen-backend" 1522 | version = "0.2.89" 1523 | source = "registry+https://github.com/rust-lang/crates.io-index" 1524 | checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" 1525 | dependencies = [ 1526 | "bumpalo", 1527 | "log", 1528 | "once_cell", 1529 | "proc-macro2", 1530 | "quote", 1531 | "syn 2.0.39", 1532 | "wasm-bindgen-shared", 1533 | ] 1534 | 1535 | [[package]] 1536 | name = "wasm-bindgen-macro" 1537 | version = "0.2.89" 1538 | source = "registry+https://github.com/rust-lang/crates.io-index" 1539 | checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" 1540 | dependencies = [ 1541 | "quote", 1542 | "wasm-bindgen-macro-support", 1543 | ] 1544 | 1545 | [[package]] 1546 | name = "wasm-bindgen-macro-support" 1547 | version = "0.2.89" 1548 | source = "registry+https://github.com/rust-lang/crates.io-index" 1549 | checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" 1550 | dependencies = [ 1551 | "proc-macro2", 1552 | "quote", 1553 | "syn 2.0.39", 1554 | "wasm-bindgen-backend", 1555 | "wasm-bindgen-shared", 1556 | ] 1557 | 1558 | [[package]] 1559 | name = "wasm-bindgen-shared" 1560 | version = "0.2.89" 1561 | source = "registry+https://github.com/rust-lang/crates.io-index" 1562 | checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" 1563 | 1564 | [[package]] 1565 | name = "winapi" 1566 | version = "0.3.9" 1567 | source = "registry+https://github.com/rust-lang/crates.io-index" 1568 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 1569 | dependencies = [ 1570 | "winapi-i686-pc-windows-gnu", 1571 | "winapi-x86_64-pc-windows-gnu", 1572 | ] 1573 | 1574 | [[package]] 1575 | name = "winapi-i686-pc-windows-gnu" 1576 | version = "0.4.0" 1577 | source = "registry+https://github.com/rust-lang/crates.io-index" 1578 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 1579 | 1580 | [[package]] 1581 | name = "winapi-x86_64-pc-windows-gnu" 1582 | version = "0.4.0" 1583 | source = "registry+https://github.com/rust-lang/crates.io-index" 1584 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 1585 | 1586 | [[package]] 1587 | name = "windows-core" 1588 | version = "0.51.1" 1589 | source = "registry+https://github.com/rust-lang/crates.io-index" 1590 | checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" 1591 | dependencies = [ 1592 | "windows-targets", 1593 | ] 1594 | 1595 | [[package]] 1596 | name = "windows-sys" 1597 | version = "0.48.0" 1598 | source = "registry+https://github.com/rust-lang/crates.io-index" 1599 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 1600 | dependencies = [ 1601 | "windows-targets", 1602 | ] 1603 | 1604 | [[package]] 1605 | name = "windows-targets" 1606 | version = "0.48.5" 1607 | source = "registry+https://github.com/rust-lang/crates.io-index" 1608 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 1609 | dependencies = [ 1610 | "windows_aarch64_gnullvm", 1611 | "windows_aarch64_msvc", 1612 | "windows_i686_gnu", 1613 | "windows_i686_msvc", 1614 | "windows_x86_64_gnu", 1615 | "windows_x86_64_gnullvm", 1616 | "windows_x86_64_msvc", 1617 | ] 1618 | 1619 | [[package]] 1620 | name = "windows_aarch64_gnullvm" 1621 | version = "0.48.5" 1622 | source = "registry+https://github.com/rust-lang/crates.io-index" 1623 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 1624 | 1625 | [[package]] 1626 | name = "windows_aarch64_msvc" 1627 | version = "0.48.5" 1628 | source = "registry+https://github.com/rust-lang/crates.io-index" 1629 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 1630 | 1631 | [[package]] 1632 | name = "windows_i686_gnu" 1633 | version = "0.48.5" 1634 | source = "registry+https://github.com/rust-lang/crates.io-index" 1635 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 1636 | 1637 | [[package]] 1638 | name = "windows_i686_msvc" 1639 | version = "0.48.5" 1640 | source = "registry+https://github.com/rust-lang/crates.io-index" 1641 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 1642 | 1643 | [[package]] 1644 | name = "windows_x86_64_gnu" 1645 | version = "0.48.5" 1646 | source = "registry+https://github.com/rust-lang/crates.io-index" 1647 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 1648 | 1649 | [[package]] 1650 | name = "windows_x86_64_gnullvm" 1651 | version = "0.48.5" 1652 | source = "registry+https://github.com/rust-lang/crates.io-index" 1653 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 1654 | 1655 | [[package]] 1656 | name = "windows_x86_64_msvc" 1657 | version = "0.48.5" 1658 | source = "registry+https://github.com/rust-lang/crates.io-index" 1659 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 1660 | 1661 | [[package]] 1662 | name = "winnow" 1663 | version = "0.5.19" 1664 | source = "registry+https://github.com/rust-lang/crates.io-index" 1665 | checksum = "829846f3e3db426d4cee4510841b71a8e58aa2a76b1132579487ae430ccd9c7b" 1666 | dependencies = [ 1667 | "memchr", 1668 | ] 1669 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "streamgen" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | authors = ["Arroyo Systems "] 7 | license = "MIT OR Apache-2.0" 8 | repository = "https://github.com/ArroyoSystems/streamgen" 9 | homepage = "https://arroyo.dev" 10 | description = """ 11 | A tool for generating streams of data for testing and benchmarking. 12 | """ 13 | 14 | categories = ["development-tools", "command-line-utilities"] 15 | 16 | keywords = ["streaming", "data", "generator", "fake", "kafka"] 17 | 18 | [features] 19 | kafka = ["rdkafka"] 20 | 21 | [dependencies] 22 | axum = "0.7.1" 23 | chrono = {version = "0.4", features = ["serde"]} 24 | clap = { version = "4.4.10", features = ["derive"] } 25 | fake = { version = "2.9.1", features = ["http", "derive"] } 26 | http = "1.0.0" 27 | rand = "0.8.5" 28 | tokio = { version = "1.34.0", features = ["full"] } 29 | tracing = "0.1.40" 30 | headers = "0.4.0" 31 | axum-extra = { version = "0.9.0", features = ["typed-header"] } 32 | tokio-stream = { version = "0.1.14", features = ["full"] } 33 | async-trait = "0.1.74" 34 | tracing-subscriber = { version = "0.3.18", features = ["default", "env-filter"] } 35 | serde = {version = "1", features = ["derive"]} 36 | serde_json = "1.0.108" 37 | 38 | rdkafka = { version = "0.36.0", features = ["cmake-build"], optional = true } 39 | uuid = { version = "1.6.1", features = ["v4"] } -------------------------------------------------------------------------------- /LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /LICENSE-MIT: -------------------------------------------------------------------------------- 1 | Copyright (c) 2014 The Rust Project Developers 2 | 3 | Permission is hereby granted, free of charge, to any 4 | person obtaining a copy of this software and associated 5 | documentation files (the "Software"), to deal in the 6 | Software without restriction, including without 7 | limitation the rights to use, copy, modify, merge, 8 | publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software 10 | is furnished to do so, subject to the following 11 | conditions: 12 | 13 | The above copyright notice and this permission notice 14 | shall be included in all copies or substantial portions 15 | of the Software. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF 18 | ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED 19 | TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 20 | PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT 21 | SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 22 | CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 23 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR 24 | IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 25 | DEALINGS IN THE SOFTWARE. 26 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Streamgen 2 | 3 | Streamgen is a CLI tool for generating streams of data for testing stream processing applications with 4 | engines like [Arroyo](https://github.com/ArroyoSystems/arroyo) or [Apache Flink](https://flink.apache.org/). 5 | 6 | [![Crates.io][crates-badge]][crates-url] 7 | [![MIT licensed][mit-badge]][mit-url] 8 | [![Build Status][actions-badge]][actions-url] 9 | 10 | [crates-badge]: https://img.shields.io/crates/v/streamgen.svg 11 | [crates-url]: https://crates.io/crates/streamgen 12 | [mit-badge]: https://img.shields.io/badge/license-MIT-blue.svg 13 | [mit-url]: https://github.com/ArroyoSystems/streamgen/blob/master/LICENSE-MIT 14 | [actions-badge]: https://github.com/ArroyoSystems/streamgen/actions/workflows/ci.yml/badge.svg 15 | [actions-url]: https://github.com/ArroyoSystems/streamgen/actions?query=branch%3Amain 16 | 17 | 18 | ## Features 19 | 20 | ### Sinks 21 | 22 | Streamgen can expose generated data via the following sinks: 23 | 24 | * `stdout` - Write data to stdout 25 | * `sse` - Run a [Server-Sent Events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events) server 26 | * `kafka` - Write data to a Kafka topic 27 | 28 | ### Formats 29 | 30 | * `string` 31 | * `json` 32 | 33 | ### Generators 34 | 35 | * `common-log` - [Common Log Format](https://en.wikipedia.org/wiki/Common_Log_Format) records 36 | * `impulse` - Stream of incrementing integers 37 | * `order` - Simulated web order events 38 | * `stock-trade` - Simulated stock trades 39 | 40 | ## Usage 41 | 42 | ``` 43 | $ streamgen --help 44 | 45 | A tool for generating streams of data for testing and benchmarking. 46 | 47 | 48 | Usage: streamgen [OPTIONS] [COMMAND] 49 | 50 | Commands: 51 | stdout Write outputs to stdout 52 | sse Run a Server-Sent Events server 53 | kafka Write outputs to Kafka 54 | help Print this message or the help of the given subcommand(s) 55 | 56 | Arguments: 57 | Type of data to generator [possible values: common-log, impulse, order, stock-trade] 58 | 59 | Options: 60 | -f, --format Format of the generated data [possible values: string, json] 61 | -r, --rate Rate of generation in records per second 62 | -l, --limit Max number of records to generate 63 | -h, --help Print help 64 | -V, --version Print version 65 | ``` 66 | 67 | Writing to stdout: 68 | ``` 69 | $ streamgen --rate 10 --format string common-log stdout 70 | 66.70.249.106 - travis_quo [01/Dec/2023:14:52:26 -0800] "GET /company.doc" 405 4521 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36" 71 | 43.89.162.120 - vesta_itaque [01/Dec/2023:14:52:26 -0800] "GET /tmp/first/same.doc" 400 4767 "-" "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_2_1 like Mac OS X; nb-no) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148a Safari/6533.18.5" 72 | 206.157.23.40 - lulu_molestias [01/Dec/2023:14:52:27 -0800] "GET /sbin/charlotte.rar" 401 1519 "-" "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)" 73 | 63.37.55.188 - roscoe_nemo [01/Dec/2023:14:52:27 -0800] "POST /var/problem/government.xls" 400 7044 "-" "Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko ) Version/5.1 Mobile/9B176 Safari/7534.48.3" 74 | 129.215.157.150 - angie_dolorum [01/Dec/2023:14:52:27 -0800] "GET /usr.txt" 405 2768 "-" "Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko ) Version/5.1 Mobile/9B176 Safari/7534.48.3" 75 | 213.73.92.8 - roscoe_omnis [01/Dec/2023:14:52:27 -0800] "GET /etc/case/life.ppt" 404 4371 "-" "Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14" 76 | ``` 77 | 78 | Writing to Kafka 79 | ```sh 80 | $ streamgen --format json order kafka --topic orders --bootstrap-servers localhost:9092 81 | ``` 82 | 83 | ## Installation 84 | 85 | ### From binaries 86 | 87 | Pre-built binaries are available for Linux and macOS on the 88 | [releases page](https://github.com/ArroyoSystems/streamgen/releases). 89 | 90 | ### From source 91 | 92 | Streamgen can be built from source via Cargo: 93 | 94 | ``` 95 | $ cargo install streamgen 96 | ``` 97 | 98 | If you would like Kafka support, you will need to pass the `--features kafka` flag to Cargo: 99 | 100 | ``` 101 | $ cargo install streamgen --features kafka 102 | ``` 103 | 104 | This relies on the rust-rdkafka library; to use this you will need to have the necessary dependencies installed 105 | on your system. See the [rust-rdkafka README](https://github.com/fede1024/rust-rdkafka#installation) for more details. 106 | -------------------------------------------------------------------------------- /resources/symbols.txt: -------------------------------------------------------------------------------- 1 | AA 2 | AAC 3 | AAN 4 | AAP 5 | AAT 6 | AAV 7 | AB 8 | ABB 9 | ABBV 10 | ABC 11 | ABEV 12 | ABG 13 | ABM 14 | ABR 15 | ABRN 16 | ABT 17 | ABX 18 | ACC 19 | ACCO 20 | ACE 21 | ACG 22 | ACH 23 | ACI 24 | ACM 25 | ACMP 26 | ACN 27 | ACP 28 | ACRE 29 | ACT 30 | ACW 31 | ADC 32 | ADM 33 | ADPT 34 | ADS 35 | ADT 36 | ADX 37 | AEB 38 | AEC 39 | AED 40 | AEE 41 | AEG 42 | AEH 43 | AEK 44 | AEL 45 | AEM 46 | AEO 47 | AEP 48 | AER 49 | AES 50 | AET 51 | AF 52 | AFA 53 | AFB 54 | AFC 55 | AFG 56 | AFGE 57 | AFL 58 | AFM 59 | AFQ 60 | AFSD 61 | AFT 62 | AFW 63 | AG 64 | AGC 65 | AGCO 66 | AGD 67 | AGI 68 | AGM 69 | AGN 70 | AGO 71 | AGRO 72 | AGU 73 | AGX 74 | AHC 75 | AHH 76 | AHL 77 | AHP 78 | AHS 79 | AHT 80 | AI 81 | AIB 82 | AIF 83 | AIG 84 | AIN 85 | AIR 86 | AIT 87 | AIV 88 | AIW 89 | AIY 90 | AIZ 91 | AJG 92 | AKP 93 | AKR 94 | AKS 95 | AL 96 | ALB 97 | ALDW 98 | ALE 99 | ALEX 100 | ALG 101 | ALJ 102 | ALK 103 | ALL 104 | ALLE 105 | ALLY 106 | ALR 107 | ALSN 108 | ALU 109 | ALV 110 | ALX 111 | AM 112 | AMBR 113 | AMC 114 | AME 115 | AMFW 116 | AMG 117 | AMH 118 | AMID 119 | AMP 120 | AMRC 121 | AMRE 122 | AMT 123 | AMTD 124 | AMTG 125 | AMX 126 | AN 127 | ANET 128 | ANF 129 | ANFI 130 | ANH 131 | ANN 132 | ANR 133 | ANTM 134 | ANW 135 | AOD 136 | AOI 137 | AOL 138 | AON 139 | AOS 140 | AP 141 | APA 142 | APAM 143 | APB 144 | APC 145 | APD 146 | APF 147 | APH 148 | APL 149 | APO 150 | APU 151 | AR 152 | ARC 153 | ARCO 154 | ARCX 155 | ARDC 156 | ARE 157 | ARES 158 | ARG 159 | ARI 160 | ARL 161 | ARMF 162 | ARMK 163 | ARN 164 | ARO 165 | ARP 166 | ARPI 167 | ARR 168 | ARU 169 | ARW 170 | ARY 171 | ASA 172 | ASB 173 | ASC 174 | ASG 175 | ASGN 176 | ASH 177 | ASPN 178 | ASR 179 | ASX 180 | AT 181 | ATE 182 | ATEN 183 | ATHM 184 | ATI 185 | ATK 186 | ATLS 187 | ATO 188 | ATR 189 | ATTO 190 | ATU 191 | ATV 192 | ATW 193 | AU 194 | AUO 195 | AUQ 196 | AUY 197 | AV 198 | AVA 199 | AVAL 200 | AVB 201 | AVD 202 | AVG 203 | AVH 204 | AVIV 205 | AVK 206 | AVOL 207 | AVP 208 | AVT 209 | AVV 210 | AVX 211 | AVY 212 | AWF 213 | AWH 214 | AWI 215 | AWK 216 | AWP 217 | AWR 218 | AXE 219 | AXL 220 | AXLL 221 | AXP 222 | AXR 223 | AXS 224 | AXTA 225 | AYI 226 | AYN 227 | AYR 228 | AZN 229 | AZO 230 | AZZ 231 | B 232 | BA 233 | BABA 234 | BAC 235 | BAF 236 | BAH 237 | BAK 238 | BALT 239 | BAM 240 | BANC 241 | BAP 242 | BAS 243 | BAX 244 | BBD 245 | BBDO 246 | BBF 247 | BBG 248 | BBK 249 | BBL 250 | BBN 251 | BBT 252 | BBVA 253 | BBW 254 | BBX 255 | BBY 256 | BC 257 | BCA 258 | BCC 259 | BCE 260 | BCEI 261 | BCH 262 | BCO 263 | BCR 264 | BCRH 265 | BCS 266 | BCX 267 | BDC 268 | BDJ 269 | BDN 270 | BDX 271 | BEE 272 | BEL 273 | BEN 274 | BEP 275 | BERY 276 | BFAM 277 | BFK 278 | BFO 279 | BFR 280 | BFS 281 | BFZ 282 | BG 283 | BGB 284 | BGC 285 | BGCA 286 | BGG 287 | BGH 288 | BGR 289 | BGS 290 | BGT 291 | BGX 292 | BGY 293 | BH 294 | BHE 295 | BHI 296 | BHK 297 | BHL 298 | BHLB 299 | BHP 300 | BID 301 | BIE 302 | BIF 303 | BIG 304 | BIN 305 | BIO 306 | BIOA 307 | BIP 308 | BIT 309 | BITA 310 | BJZ 311 | BK 312 | BKD 313 | BKE 314 | BKH 315 | BKK 316 | BKN 317 | BKS 318 | BKT 319 | BKU 320 | BLH 321 | BLK 322 | BLL 323 | BLOX 324 | BLT 325 | BLW 326 | BLX 327 | BMA 328 | BME 329 | BMI 330 | BMO 331 | BMR 332 | BMS 333 | BMY 334 | BNJ 335 | BNK 336 | BNS 337 | BNY 338 | BOCA 339 | BOE 340 | BOH 341 | BOI 342 | BOOT 343 | BORN 344 | BOXC 345 | BP 346 | BPI 347 | BPK 348 | BPL 349 | BPT 350 | BPY 351 | BPZ 352 | BQH 353 | BR 354 | BRC 355 | BRFS 356 | BRO 357 | BRP 358 | BRS 359 | BRSS 360 | BRT 361 | BRX 362 | BSAC 363 | BSBR 364 | BSD 365 | BSE 366 | BSI 367 | BSL 368 | BSMX 369 | BST 370 | BSX 371 | BT 372 | BTA 373 | BTE 374 | BTF 375 | BTH 376 | BTO 377 | BTT 378 | BTU 379 | BTZ 380 | BUD 381 | BUI 382 | BURL 383 | BVN 384 | BWA 385 | BWC 386 | BWG 387 | BWP 388 | BWS 389 | BX 390 | BXC 391 | BXE 392 | BXMT 393 | BXMX 394 | BXP 395 | BXS 396 | BYD 397 | BYM 398 | BZH 399 | BZT 400 | C 401 | CAB 402 | CACI 403 | CAE 404 | CAF 405 | CAG 406 | CAH 407 | CAJ 408 | CALX 409 | CAM 410 | CAP 411 | CAPL 412 | CAS 413 | CAT 414 | CATO 415 | CB 416 | CBA 417 | CBB 418 | CBD 419 | CBG 420 | CBI 421 | CBK 422 | CBL 423 | CBM 424 | CBPX 425 | CBR 426 | CBS 427 | CBT 428 | CBU 429 | CBZ 430 | CCC 431 | CCE 432 | CCG 433 | CCI 434 | CCJ 435 | CCK 436 | CCL 437 | CCM 438 | CCO 439 | CCS 440 | CCSC 441 | CCU 442 | CCV 443 | CCZ 444 | CDE 445 | CDI 446 | CDR 447 | CE 448 | CEA 449 | CEB 450 | CEE 451 | CEL 452 | CELP 453 | CEM 454 | CEN 455 | CEO 456 | CEQP 457 | CF 458 | CFG 459 | CFI 460 | CFN 461 | CFR 462 | CFX 463 | CGA 464 | CGG 465 | CGI 466 | CHA 467 | CHD 468 | CHE 469 | CHGG 470 | CHH 471 | CHK 472 | CHKR 473 | CHL 474 | CHMI 475 | CHMT 476 | CHN 477 | CHS 478 | CHSP 479 | CHT 480 | CHU 481 | CI 482 | CIA 483 | CIB 484 | CIE 485 | CIEN 486 | CIF 487 | CIG 488 | CII 489 | CIM 490 | CIO 491 | CIR 492 | CIT 493 | CIVI 494 | CJES 495 | CKH 496 | CKP 497 | CL 498 | CLA 499 | CLB 500 | CLC 501 | CLD 502 | CLDT 503 | CLF 504 | CLGX 505 | CLH 506 | CLI 507 | CLNY 508 | CLR 509 | CLS 510 | CLV 511 | CLW 512 | CLX 513 | CM 514 | CMA 515 | CMC 516 | CMCM 517 | CMG 518 | CMI 519 | CMK 520 | CMLP 521 | CMN 522 | CMO 523 | CMP 524 | CMRE 525 | CMS 526 | CMU 527 | CNA 528 | CNC 529 | CNCO 530 | CNHI 531 | CNI 532 | CNK 533 | CNL 534 | CNNX 535 | CNO 536 | CNP 537 | CNQ 538 | CNS 539 | CNW 540 | CNX 541 | CO 542 | CODE 543 | CODI 544 | COF 545 | COG 546 | COH 547 | COL 548 | COO 549 | COP 550 | COR 551 | CORR 552 | COT 553 | COTY 554 | COUP 555 | COV 556 | CP 557 | CPA 558 | CPAC 559 | CPB 560 | CPE 561 | CPF 562 | CPG 563 | CPK 564 | CPL 565 | CPN 566 | CPS 567 | CPT 568 | CR 569 | CRC 570 | CRCM 571 | CRH 572 | CRI 573 | CRK 574 | CRL 575 | CRM 576 | CRR 577 | CRS 578 | CRT 579 | CRY 580 | CS 581 | CSC 582 | CSG 583 | CSH 584 | CSI 585 | CSL 586 | CSLT 587 | CSS 588 | CST 589 | CSTM 590 | CSU 591 | CSV 592 | CSX 593 | CTB 594 | CTL 595 | CTLT 596 | CTQ 597 | CTR 598 | CTS 599 | CTT 600 | CTU 601 | CTV 602 | CTW 603 | CTX 604 | CTY 605 | CUB 606 | CUBE 607 | CUBI 608 | CUBS 609 | CUDA 610 | CUK 611 | CUZ 612 | CVA 613 | CVB 614 | CVC 615 | CVD 616 | CVE 617 | CVEO 618 | CVG 619 | CVI 620 | CVO 621 | CVRR 622 | CVS 623 | CVT 624 | CVX 625 | CW 626 | CWEI 627 | CWT 628 | CX 629 | CXE 630 | CXH 631 | CXO 632 | CXP 633 | CXW 634 | CYD 635 | CYH 636 | CYN 637 | CYNI 638 | CYS 639 | CYT 640 | CZZ 641 | D 642 | DAC 643 | DAL 644 | DAN 645 | DANG 646 | DAR 647 | DATA 648 | DB 649 | DBD 650 | DBL 651 | DCA 652 | DCI 653 | DCM 654 | DCO 655 | DCT 656 | DCUA 657 | DCUB 658 | DCUC 659 | DD 660 | DDC 661 | DDD 662 | DDE 663 | DDF 664 | DDR 665 | DDS 666 | DDT 667 | DE 668 | DECK 669 | DEG 670 | DEI 671 | DEL 672 | DEO 673 | DEX 674 | DF 675 | DFP 676 | DFS 677 | DFT 678 | DG 679 | DGI 680 | DGX 681 | DHF 682 | DHG 683 | DHI 684 | DHR 685 | DHT 686 | DHX 687 | DIAX 688 | DIN 689 | DIS 690 | DK 691 | DKL 692 | DKS 693 | DKT 694 | DL 695 | DLB 696 | DLNG 697 | DLPH 698 | DLR 699 | DLX 700 | DM 701 | DMB 702 | DMD 703 | DMO 704 | DNB 705 | DNI 706 | DNOW 707 | DNP 708 | DNR 709 | DNY 710 | DO 711 | DOC 712 | DOM 713 | DOOR 714 | DOV 715 | DOW 716 | DPG 717 | DPLO 718 | DPM 719 | DPS 720 | DPZ 721 | DQ 722 | DRA 723 | DRC 724 | DRD 725 | DRE 726 | DRH 727 | DRI 728 | DRII 729 | DRL 730 | DRQ 731 | DSE 732 | DSL 733 | DSM 734 | DST 735 | DSU 736 | DSW 737 | DSX 738 | DTE 739 | DTF 740 | DTK 741 | DTQ 742 | DTT 743 | DTZ 744 | DUA 745 | DUC 746 | DUK 747 | DUKH 748 | DV 749 | DVA 750 | DVD 751 | DVN 752 | DW 753 | DWRE 754 | DX 755 | DXB 756 | DY 757 | DYN 758 | E 759 | EAA 760 | EAB 761 | EAE 762 | EARN 763 | EAT 764 | EBF 765 | EBR 766 | EBS 767 | EC 768 | ECA 769 | ECC 770 | ECL 771 | ECOM 772 | ECR 773 | ECT 774 | ED 775 | EDD 776 | EDE 777 | EDF 778 | EDI 779 | EDN 780 | EDR 781 | EDU 782 | EE 783 | EEA 784 | EEP 785 | EEQ 786 | EFC 787 | EFF 788 | EFM 789 | EFR 790 | EFT 791 | EFX 792 | EGF 793 | EGL 794 | EGN 795 | EGO 796 | EGP 797 | EGY 798 | EHI 799 | EHIC 800 | EIG 801 | EIX 802 | EJ 803 | EL 804 | ELA 805 | ELB 806 | ELJ 807 | ELLI 808 | ELP 809 | ELS 810 | ELU 811 | ELX 812 | ELY 813 | EMC 814 | EMD 815 | EME 816 | EMES 817 | EMF 818 | EMN 819 | EMO 820 | EMQ 821 | EMR 822 | EMZ 823 | ENB 824 | ENBL 825 | ENH 826 | ENI 827 | ENJ 828 | ENL 829 | ENLC 830 | ENLK 831 | ENR 832 | ENS 833 | ENV 834 | ENVA 835 | ENZ 836 | EOC 837 | EOD 838 | EOG 839 | EOI 840 | EOS 841 | EOT 842 | EPAM 843 | EPD 844 | EPE 845 | EPR 846 | EQC 847 | EQCO 848 | EQM 849 | EQR 850 | EQS 851 | EQT 852 | EQY 853 | ERA 854 | ERF 855 | ERJ 856 | EROS 857 | ESD 858 | ESE 859 | ESI 860 | ESL 861 | ESNT 862 | ESRT 863 | ESS 864 | ESV 865 | ETB 866 | ETE 867 | ETG 868 | ETH 869 | ETJ 870 | ETM 871 | ETN 872 | ETO 873 | ETP 874 | ETR 875 | ETV 876 | ETW 877 | ETX 878 | ETY 879 | EV 880 | EVC 881 | EVDY 882 | EVER 883 | EVF 884 | EVG 885 | EVGN 886 | EVHC 887 | EVN 888 | EVR 889 | EVT 890 | EVTC 891 | EW 892 | EXAM 893 | EXAR 894 | EXC 895 | EXCU 896 | EXD 897 | EXG 898 | EXH 899 | EXK 900 | EXL 901 | EXP 902 | EXPR 903 | EXR 904 | EZT 905 | F 906 | FAC 907 | FAF 908 | FAM 909 | FAV 910 | FBC 911 | FBHS 912 | FBP 913 | FBR 914 | FC 915 | FCAM 916 | FCAU 917 | FCB 918 | FCF 919 | FCH 920 | FCN 921 | FCT 922 | FCX 923 | FDI 924 | FDO 925 | FDP 926 | FDS 927 | FDX 928 | FE 929 | FEI 930 | FELP 931 | FENG 932 | FEO 933 | FET 934 | FF 935 | FFA 936 | FFC 937 | FFG 938 | FGB 939 | FGL 940 | FGP 941 | FHN 942 | FHY 943 | FI 944 | FICO 945 | FIF 946 | FIG 947 | FII 948 | FIS 949 | FIX 950 | FL 951 | FLC 952 | FLO 953 | FLR 954 | FLS 955 | FLT 956 | FLTX 957 | FLY 958 | FMC 959 | FMD 960 | FMN 961 | FMO 962 | FMS 963 | FMSA 964 | FMX 965 | FMY 966 | FN 967 | FNB 968 | FNF 969 | FNFV 970 | FNV 971 | FOE 972 | FOF 973 | FOR 974 | FPF 975 | FPL 976 | FPO 977 | FPT 978 | FR 979 | FRA 980 | FRC 981 | FRM 982 | FRO 983 | FRT 984 | FSCE 985 | FSD 986 | FSIC 987 | FSL 988 | FSM 989 | FSS 990 | FT 991 | FTI 992 | FTK 993 | FTT 994 | FUL 995 | FUN 996 | FUR 997 | FVE 998 | FXCM 999 | G 1000 | GAB 1001 | GAM 1002 | GAS 1003 | GB 1004 | GBAB 1005 | GBL 1006 | GBX 1007 | GCA 1008 | GCAP 1009 | GCH 1010 | GCI 1011 | GCO 1012 | GCV 1013 | GD 1014 | GDF 1015 | GDL 1016 | GDO 1017 | GDOT 1018 | GDP 1019 | GDV 1020 | GE 1021 | GEB 1022 | GEF 1023 | GEH 1024 | GEK 1025 | GEL 1026 | GEO 1027 | GEQ 1028 | GER 1029 | GES 1030 | GF 1031 | GFA 1032 | GFF 1033 | GFI 1034 | GFIG 1035 | GFY 1036 | GG 1037 | GGB 1038 | GGE 1039 | GGG 1040 | GGM 1041 | GGP 1042 | GGT 1043 | GGZ 1044 | GHC 1045 | GHI 1046 | GHL 1047 | GHM 1048 | GHY 1049 | GIB 1050 | GIL 1051 | GIM 1052 | GIMO 1053 | GIS 1054 | GJH 1055 | GJO 1056 | GJP 1057 | GJR 1058 | GJS 1059 | GJT 1060 | GJV 1061 | GLF 1062 | GLOB 1063 | GLOG 1064 | GLOP 1065 | GLP 1066 | GLPW 1067 | GLT 1068 | GLW 1069 | GM 1070 | GME 1071 | GMED 1072 | GMK 1073 | GMT 1074 | GMZ 1075 | GNC 1076 | GNE 1077 | GNI 1078 | GNRC 1079 | GNT 1080 | GNW 1081 | GOF 1082 | GOL 1083 | GOV 1084 | GPC 1085 | GPI 1086 | GPK 1087 | GPM 1088 | GPN 1089 | GPRK 1090 | GPS 1091 | GPT 1092 | GPX 1093 | GRA 1094 | GRAM 1095 | GRO 1096 | GRR 1097 | GRT 1098 | GRUB 1099 | GRX 1100 | GS 1101 | GSF 1102 | GSH 1103 | GSI 1104 | GSJ 1105 | GSK 1106 | GSL 1107 | GTI 1108 | GTN 1109 | GTS 1110 | GTT 1111 | GTY 1112 | GUA 1113 | GUT 1114 | GVA 1115 | GWB 1116 | GWR 1117 | GWRE 1118 | GWRU 1119 | GWW 1120 | GXP 1121 | GY 1122 | GYB 1123 | GYC 1124 | GZT 1125 | H 1126 | HAE 1127 | HAL 1128 | HAR 1129 | HASI 1130 | HBI 1131 | HBM 1132 | HCA 1133 | HCC 1134 | HCI 1135 | HCJ 1136 | HCLP 1137 | HCN 1138 | HCP 1139 | HD 1140 | HDB 1141 | HDY 1142 | HE 1143 | HEI 1144 | HELI 1145 | HEP 1146 | HEQ 1147 | HES 1148 | HF 1149 | HFC 1150 | HGG 1151 | HGH 1152 | HGR 1153 | HGT 1154 | HHC 1155 | HHS 1156 | HHY 1157 | HI 1158 | HIE 1159 | HIG 1160 | HII 1161 | HIL 1162 | HIO 1163 | HIVE 1164 | HIW 1165 | HIX 1166 | HJV 1167 | HK 1168 | HL 1169 | HLF 1170 | HLS 1171 | HLT 1172 | HLX 1173 | HMC 1174 | HME 1175 | HMLP 1176 | HMN 1177 | HMY 1178 | HNI 1179 | HNP 1180 | HNR 1181 | HNT 1182 | HOG 1183 | HON 1184 | HOS 1185 | HOT 1186 | HOV 1187 | HP 1188 | HPF 1189 | HPI 1190 | HPP 1191 | HPQ 1192 | HPS 1193 | HPT 1194 | HPY 1195 | HQH 1196 | HQL 1197 | HR 1198 | HRB 1199 | HRC 1200 | HRG 1201 | HRL 1202 | HRS 1203 | HRTG 1204 | HSBC 1205 | HSC 1206 | HSEA 1207 | HSEB 1208 | HSP 1209 | HST 1210 | HSY 1211 | HT 1212 | HTA 1213 | HTD 1214 | HTF 1215 | HTGC 1216 | HTGX 1217 | HTGY 1218 | HTGZ 1219 | HTH 1220 | HTR 1221 | HTS 1222 | HTY 1223 | HTZ 1224 | HUBS 1225 | HUM 1226 | HUN 1227 | HVB 1228 | HVT 1229 | HW 1230 | HXL 1231 | HY 1232 | HYB 1233 | HYF 1234 | HYH 1235 | HYI 1236 | HYT 1237 | HZO 1238 | I 1239 | IAE 1240 | IAG 1241 | IBA 1242 | IBM 1243 | IBN 1244 | IBP 1245 | ICA 1246 | ICB 1247 | ICD 1248 | ICE 1249 | ICL 1250 | IDA 1251 | IDE 1252 | IDG 1253 | IDT 1254 | IEH 1255 | IEX 1256 | IFF 1257 | IFN 1258 | IFT 1259 | IGA 1260 | IGD 1261 | IGI 1262 | IGR 1263 | IGT 1264 | IHC 1265 | IHD 1266 | IHG 1267 | IHS 1268 | IID 1269 | IIF 1270 | IIM 1271 | IL 1272 | IM 1273 | IMAX 1274 | IMN 1275 | IMPR 1276 | IMPV 1277 | IMS 1278 | INB 1279 | IND 1280 | INF 1281 | INFY 1282 | ING 1283 | INGR 1284 | INN 1285 | INT 1286 | INVN 1287 | INXN 1288 | INZ 1289 | IO 1290 | IOC 1291 | IP 1292 | IPG 1293 | IPHI 1294 | IPI 1295 | IQI 1296 | IR 1297 | IRC 1298 | IRE 1299 | IRET 1300 | IRF 1301 | IRL 1302 | IRM 1303 | IRR 1304 | IRS 1305 | ISD 1306 | ISF 1307 | ISG 1308 | ISH 1309 | ISP 1310 | IT 1311 | ITC 1312 | ITG 1313 | ITT 1314 | ITUB 1315 | ITW 1316 | IVC 1317 | IVH 1318 | IVR 1319 | IVZ 1320 | IX 1321 | JAH 1322 | JBK 1323 | JBL 1324 | JBN 1325 | JBR 1326 | JBT 1327 | JCE 1328 | JCI 1329 | JCP 1330 | JDD 1331 | JE 1332 | JEC 1333 | JEQ 1334 | JFC 1335 | JFR 1336 | JGH 1337 | JGV 1338 | JGW 1339 | JHI 1340 | JHP 1341 | JHS 1342 | JHX 1343 | JKS 1344 | JLL 1345 | JLS 1346 | JMEI 1347 | JMF 1348 | JMI 1349 | JMLP 1350 | JMM 1351 | JMP 1352 | JMPB 1353 | JMPC 1354 | JMT 1355 | JNJ 1356 | JNPR 1357 | JNS 1358 | JOE 1359 | JOF 1360 | JONE 1361 | JOY 1362 | JPC 1363 | JPEP 1364 | JPI 1365 | JPM 1366 | JPS 1367 | JPW 1368 | JQC 1369 | JRI 1370 | JRN 1371 | JRO 1372 | JSD 1373 | JTA 1374 | JTD 1375 | JTP 1376 | JWN 1377 | K 1378 | KAI 1379 | KAMN 1380 | KAP 1381 | KAR 1382 | KATE 1383 | KB 1384 | KBH 1385 | KBR 1386 | KCC 1387 | KCG 1388 | KED 1389 | KEF 1390 | KEG 1391 | KEM 1392 | KEP 1393 | KEX 1394 | KEY 1395 | KEYS 1396 | KF 1397 | KFH 1398 | KFI 1399 | KFS 1400 | KFY 1401 | KGC 1402 | KHI 1403 | KIM 1404 | KING 1405 | KIO 1406 | KKD 1407 | KKR 1408 | KMB 1409 | KMF 1410 | KMG 1411 | KMI 1412 | KMM 1413 | KMPA 1414 | KMPR 1415 | KMT 1416 | KMX 1417 | KN 1418 | KND 1419 | KNL 1420 | KNM 1421 | KNOP 1422 | KNX 1423 | KO 1424 | KODK 1425 | KOF 1426 | KOP 1427 | KORS 1428 | KOS 1429 | KR 1430 | KRA 1431 | KRC 1432 | KRG 1433 | KRO 1434 | KS 1435 | KSM 1436 | KSS 1437 | KST 1438 | KSU 1439 | KT 1440 | KTF 1441 | KTH 1442 | KTN 1443 | KTP 1444 | KW 1445 | KWN 1446 | KWR 1447 | KYE 1448 | KYN 1449 | KYO 1450 | L 1451 | LAD 1452 | LADR 1453 | LAS 1454 | LAZ 1455 | LB 1456 | LBF 1457 | LC 1458 | LCI 1459 | LCM 1460 | LDF 1461 | LDL 1462 | LDOS 1463 | LDP 1464 | LDR 1465 | LEA 1466 | LEAF 1467 | LEE 1468 | LEG 1469 | LEJU 1470 | LEN 1471 | LEO 1472 | LEU 1473 | LF 1474 | LFC 1475 | LFL 1476 | LG 1477 | LGF 1478 | LGI 1479 | LH 1480 | LHO 1481 | LII 1482 | LITB 1483 | LL 1484 | LLL 1485 | LLY 1486 | LM 1487 | LMT 1488 | LNC 1489 | LND 1490 | LNKD 1491 | LNN 1492 | LNT 1493 | LO 1494 | LOCK 1495 | LOR 1496 | LOW 1497 | LPG 1498 | LPI 1499 | LPL 1500 | LPT 1501 | LPX 1502 | LQ 1503 | LRE 1504 | LRN 1505 | LTC 1506 | LTM 1507 | LUB 1508 | LUK 1509 | LUV 1510 | LUX 1511 | LVLT 1512 | LVS 1513 | LXFR 1514 | LXFT 1515 | LXK 1516 | LXP 1517 | LXU 1518 | LYB 1519 | LYG 1520 | LYV 1521 | LZB 1522 | M 1523 | MA 1524 | MAA 1525 | MAC 1526 | MAIN 1527 | MAN 1528 | MANU 1529 | MAS 1530 | MATX 1531 | MAV 1532 | MBI 1533 | MBLY 1534 | MBT 1535 | MC 1536 | MCA 1537 | MCC 1538 | MCD 1539 | MCI 1540 | MCK 1541 | MCN 1542 | MCO 1543 | MCP 1544 | MCQ 1545 | MCR 1546 | MCS 1547 | MCV 1548 | MCY 1549 | MD 1550 | MDC 1551 | MDLY 1552 | MDP 1553 | MDR 1554 | MDT 1555 | MDU 1556 | MED 1557 | MEG 1558 | MEI 1559 | MEN 1560 | MEP 1561 | MET 1562 | MFA 1563 | MFC 1564 | MFD 1565 | MFG 1566 | MFL 1567 | MFM 1568 | MFO 1569 | MFT 1570 | MFV 1571 | MG 1572 | MGA 1573 | MGF 1574 | MGM 1575 | MGR 1576 | MGU 1577 | MHD 1578 | MHF 1579 | MHFI 1580 | MHG 1581 | MHI 1582 | MHK 1583 | MHN 1584 | MHNA 1585 | MHNB 1586 | MHNC 1587 | MHO 1588 | MHR 1589 | MHY 1590 | MIC 1591 | MIE 1592 | MIG 1593 | MIL 1594 | MILL 1595 | MIN 1596 | MITT 1597 | MIXT 1598 | MIY 1599 | MJI 1600 | MJN 1601 | MKC 1602 | MKL 1603 | MLI 1604 | MLM 1605 | MLP 1606 | MLR 1607 | MM 1608 | MMC 1609 | MMD 1610 | MMI 1611 | MMM 1612 | MMP 1613 | MMS 1614 | MMT 1615 | MMU 1616 | MN 1617 | MNE 1618 | MNI 1619 | MNK 1620 | MNP 1621 | MNR 1622 | MO 1623 | MOD 1624 | MODN 1625 | MOH 1626 | MON 1627 | MORE 1628 | MOS 1629 | MOV 1630 | MPA 1631 | MPC 1632 | MPG 1633 | MPLX 1634 | MPO 1635 | MPV 1636 | MPW 1637 | MPX 1638 | MQT 1639 | MQY 1640 | MR 1641 | MRC 1642 | MRH 1643 | MRIN 1644 | MRK 1645 | MRO 1646 | MS 1647 | MSA 1648 | MSB 1649 | MSCA 1650 | MSCI 1651 | MSD 1652 | MSF 1653 | MSI 1654 | MSJ 1655 | MSK 1656 | MSL 1657 | MSM 1658 | MSO 1659 | MSP 1660 | MSZ 1661 | MT 1662 | MTB 1663 | MTCN 1664 | MTD 1665 | MTDR 1666 | MTG 1667 | MTH 1668 | MTL 1669 | MTN 1670 | MTOR 1671 | MTR 1672 | MTRN 1673 | MTS 1674 | MTT 1675 | MTU 1676 | MTW 1677 | MTX 1678 | MTZ 1679 | MUA 1680 | MUC 1681 | MUE 1682 | MUH 1683 | MUI 1684 | MUJ 1685 | MUR 1686 | MUS 1687 | MUSA 1688 | MUX 1689 | MVC 1690 | MVCB 1691 | MVNR 1692 | MVO 1693 | MVT 1694 | MW 1695 | MWA 1696 | MWE 1697 | MWG 1698 | MWO 1699 | MWR 1700 | MWV 1701 | MWW 1702 | MX 1703 | MXE 1704 | MXF 1705 | MXL 1706 | MY 1707 | MYC 1708 | MYCC 1709 | MYD 1710 | MYE 1711 | MYF 1712 | MYI 1713 | MYJ 1714 | MYM 1715 | MYN 1716 | MZF 1717 | N 1718 | NAC 1719 | NAD 1720 | NADL 1721 | NAN 1722 | NAO 1723 | NAP 1724 | NAT 1725 | NAV 1726 | NAZ 1727 | NBB 1728 | NBD 1729 | NBG 1730 | NBHC 1731 | NBL 1732 | NBR 1733 | NC 1734 | NCA 1735 | NCFT 1736 | NCI 1737 | NCR 1738 | NCS 1739 | NCT 1740 | NCV 1741 | NCZ 1742 | NDP 1743 | NDRO 1744 | NE 1745 | NEA 1746 | NEE 1747 | NEFF 1748 | NEM 1749 | NEP 1750 | NES 1751 | NEU 1752 | NEV 1753 | NEWM 1754 | NEWR 1755 | NFG 1756 | NFJ 1757 | NFX 1758 | NGG 1759 | NGL 1760 | NGLS 1761 | NGS 1762 | NGVC 1763 | NHF 1764 | NHI 1765 | NI 1766 | NID 1767 | NIE 1768 | NIM 1769 | NIO 1770 | NIQ 1771 | NJ 1772 | NJR 1773 | NKA 1774 | NKE 1775 | NKG 1776 | NKX 1777 | NL 1778 | NLS 1779 | NLSN 1780 | NLY 1781 | NM 1782 | NMA 1783 | NMBL 1784 | NMFC 1785 | NMI 1786 | NMM 1787 | NMO 1788 | NMR 1789 | NMS 1790 | NMT 1791 | NMY 1792 | NNA 1793 | NNC 1794 | NNI 1795 | NNN 1796 | NNP 1797 | NNY 1798 | NOA 1799 | NOAH 1800 | NOC 1801 | NOK 1802 | NOR 1803 | NORD 1804 | NOV 1805 | NOW 1806 | NP 1807 | NPD 1808 | NPF 1809 | NPI 1810 | NPK 1811 | NPM 1812 | NPO 1813 | NPP 1814 | NPT 1815 | NPTN 1816 | NPV 1817 | NQ 1818 | NQI 1819 | NQM 1820 | NQP 1821 | NQS 1822 | NQU 1823 | NR 1824 | NRF 1825 | NRG 1826 | NRK 1827 | NRP 1828 | NRT 1829 | NRZ 1830 | NS 1831 | NSAM 1832 | NSC 1833 | NSH 1834 | NSL 1835 | NSLP 1836 | NSM 1837 | NSP 1838 | NSR 1839 | NSS 1840 | NTC 1841 | NTG 1842 | NTI 1843 | NTL 1844 | NTP 1845 | NTT 1846 | NTX 1847 | NTZ 1848 | NU 1849 | NUE 1850 | NUM 1851 | NUO 1852 | NUS 1853 | NUV 1854 | NUW 1855 | NVGS 1856 | NVO 1857 | NVR 1858 | NVRO 1859 | NVS 1860 | NWE 1861 | NWHM 1862 | NWL 1863 | NWN 1864 | NWY 1865 | NX 1866 | NXC 1867 | NXJ 1868 | NXN 1869 | NXP 1870 | NXQ 1871 | NXR 1872 | NYCB 1873 | NYLD 1874 | NYRT 1875 | NYT 1876 | O 1877 | OAK 1878 | OAKS 1879 | OAS 1880 | OB 1881 | OC 1882 | OCIP 1883 | OCIR 1884 | OCN 1885 | OCR 1886 | ODC 1887 | OEC 1888 | OFC 1889 | OFG 1890 | OGE 1891 | OGS 1892 | OHI 1893 | OI 1894 | OIA 1895 | OIBR 1896 | OII 1897 | OILT 1898 | OIS 1899 | OKE 1900 | OKS 1901 | OLN 1902 | OLP 1903 | OMAM 1904 | OMC 1905 | OME 1906 | OMG 1907 | OMI 1908 | OMN 1909 | ONDK 1910 | ONE 1911 | OPK 1912 | OPWR 1913 | OPY 1914 | ORA 1915 | ORAN 1916 | ORB 1917 | ORC 1918 | ORCL 1919 | ORI 1920 | ORN 1921 | OSK 1922 | OUBS 1923 | OUT 1924 | OWW 1925 | OXM 1926 | OXY 1927 | OZM 1928 | P 1929 | PAA 1930 | PAC 1931 | PACD 1932 | PAG 1933 | PAGP 1934 | PAH 1935 | PAI 1936 | PAM 1937 | PANW 1938 | PAR 1939 | PAY 1940 | PAYC 1941 | PB 1942 | PBA 1943 | PBF 1944 | PBFX 1945 | PBH 1946 | PBI 1947 | PBR 1948 | PBT 1949 | PBY 1950 | PBYI 1951 | PCF 1952 | PCG 1953 | PCI 1954 | PCK 1955 | PCL 1956 | PCM 1957 | PCN 1958 | PCP 1959 | PCQ 1960 | PDI 1961 | PDM 1962 | PDS 1963 | PDT 1964 | PE 1965 | PEB 1966 | PEG 1967 | PEI 1968 | PEO 1969 | PEP 1970 | PER 1971 | PES 1972 | PF 1973 | PFD 1974 | PFE 1975 | PFG 1976 | PFH 1977 | PFK 1978 | PFL 1979 | PFN 1980 | PFO 1981 | PFS 1982 | PFSI 1983 | PFX 1984 | PG 1985 | PGEM 1986 | PGH 1987 | PGI 1988 | PGN 1989 | PGP 1990 | PGR 1991 | PGRE 1992 | PGZ 1993 | PH 1994 | PHD 1995 | PHG 1996 | PHH 1997 | PHI 1998 | PHK 1999 | PHM 2000 | PHT 2001 | PHX 2002 | PII 2003 | PIM 2004 | PIR 2005 | PIY 2006 | PJC 2007 | PJH 2008 | PJS 2009 | PKD 2010 | PKE 2011 | PKG 2012 | PKI 2013 | PKO 2014 | PKX 2015 | PKY 2016 | PL 2017 | PLD 2018 | PLL 2019 | PLOW 2020 | PLT 2021 | PM 2022 | PMC 2023 | PMF 2024 | PML 2025 | PMM 2026 | PMO 2027 | PMT 2028 | PMX 2029 | PNC 2030 | PNF 2031 | PNI 2032 | PNK 2033 | PNM 2034 | PNR 2035 | PNTA 2036 | PNW 2037 | PNX 2038 | PNY 2039 | POL 2040 | POM 2041 | POR 2042 | POST 2043 | POT 2044 | POWR 2045 | PPG 2046 | PPL 2047 | PPO 2048 | PPP 2049 | PPR 2050 | PPS 2051 | PPT 2052 | PPX 2053 | PQ 2054 | PRA 2055 | PRE 2056 | PRGO 2057 | PRH 2058 | PRI 2059 | PRLB 2060 | PRO 2061 | PRU 2062 | PRY 2063 | PSA 2064 | PSB 2065 | PSF 2066 | PSG 2067 | PSO 2068 | PSX 2069 | PSXP 2070 | PT 2071 | PTP 2072 | PTR 2073 | PTY 2074 | PUK 2075 | PVA 2076 | PVG 2077 | PVH 2078 | PVTD 2079 | PWE 2080 | PWR 2081 | PX 2082 | PXD 2083 | PYB 2084 | PYN 2085 | PYS 2086 | PYT 2087 | PZB 2088 | PZC 2089 | PZE 2090 | PZN 2091 | Q 2092 | QEP 2093 | QEPM 2094 | QIHU 2095 | QSR 2096 | QTM 2097 | QTS 2098 | QTWO 2099 | QUAD 2100 | R 2101 | RAD 2102 | RAI 2103 | RALY 2104 | RAS 2105 | RATE 2106 | RAX 2107 | RBA 2108 | RBC 2109 | RBS 2110 | RCAP 2111 | RCI 2112 | RCL 2113 | RCS 2114 | RDC 2115 | RDN 2116 | RDY 2117 | RE 2118 | REG 2119 | REN 2120 | RENN 2121 | RES 2122 | RESI 2123 | REV 2124 | REX 2125 | REXR 2126 | RF 2127 | RFI 2128 | RFP 2129 | RFT 2130 | RFTA 2131 | RGA 2132 | RGC 2133 | RGP 2134 | RGR 2135 | RGS 2136 | RGT 2137 | RH 2138 | RHI 2139 | RHP 2140 | RHT 2141 | RICE 2142 | RIG 2143 | RIGP 2144 | RIO 2145 | RIOM 2146 | RIT 2147 | RJD 2148 | RJF 2149 | RKT 2150 | RKUS 2151 | RL 2152 | RLD 2153 | RLGY 2154 | RLH 2155 | RLI 2156 | RLJ 2157 | RM 2158 | RMAX 2159 | RMD 2160 | RMP 2161 | RMT 2162 | RNDY 2163 | RNE 2164 | RNF 2165 | RNG 2166 | RNO 2167 | RNP 2168 | RNR 2169 | ROC 2170 | ROG 2171 | ROK 2172 | ROL 2173 | ROP 2174 | ROYT 2175 | RPAI 2176 | RPM 2177 | RPT 2178 | RQI 2179 | RRC 2180 | RRMS 2181 | RRTS 2182 | RS 2183 | RSE 2184 | RSG 2185 | RSH 2186 | RSO 2187 | RSPP 2188 | RST 2189 | RT 2190 | RTEC 2191 | RTI 2192 | RTN 2193 | RUBI 2194 | RUK 2195 | RVT 2196 | RWT 2197 | RXN 2198 | RY 2199 | RYAM 2200 | RYI 2201 | RYL 2202 | RYN 2203 | RZA 2204 | S 2205 | SA 2206 | SAH 2207 | SAIC 2208 | SALT 2209 | SAM 2210 | SAN 2211 | SAP 2212 | SAQ 2213 | SAR 2214 | SB 2215 | SBGL 2216 | SBH 2217 | SBNA 2218 | SBNB 2219 | SBR 2220 | SBS 2221 | SBW 2222 | SBY 2223 | SC 2224 | SCCO 2225 | SCD 2226 | SCG 2227 | SCHW 2228 | SCI 2229 | SCL 2230 | SCM 2231 | SCQ 2232 | SCS 2233 | SCU 2234 | SCX 2235 | SD 2236 | SDLP 2237 | SDR 2238 | SDRL 2239 | SDT 2240 | SE 2241 | SEAS 2242 | SEE 2243 | SEM 2244 | SEMG 2245 | SEP 2246 | SERV 2247 | SF 2248 | SFB 2249 | SFE 2250 | SFG 2251 | SFL 2252 | SFN 2253 | SFS 2254 | SFUN 2255 | SFY 2256 | SGF 2257 | SGL 2258 | SGM 2259 | SGU 2260 | SGY 2261 | SGZA 2262 | SHG 2263 | SHI 2264 | SHLX 2265 | SHO 2266 | SHW 2267 | SID 2268 | SIG 2269 | SIR 2270 | SIX 2271 | SJI 2272 | SJM 2273 | SJR 2274 | SJT 2275 | SJW 2276 | SKH 2277 | SKM 2278 | SKT 2279 | SKX 2280 | SLB 2281 | SLCA 2282 | SLF 2283 | SLG 2284 | SLH 2285 | SLRA 2286 | SLTB 2287 | SLW 2288 | SM 2289 | SMFG 2290 | SMG 2291 | SMI 2292 | SMLP 2293 | SMM 2294 | SMP 2295 | SN 2296 | SNA 2297 | SNE 2298 | SNH 2299 | SNHN 2300 | SNI 2301 | SNN 2302 | SNOW 2303 | SNP 2304 | SNR 2305 | SNV 2306 | SNX 2307 | SNY 2308 | SO 2309 | SOL 2310 | SON 2311 | SOR 2312 | SPA 2313 | SPB 2314 | SPE 2315 | SPF 2316 | SPG 2317 | SPH 2318 | SPLP 2319 | SPN 2320 | SPR 2321 | SPW 2322 | SPXX 2323 | SQM 2324 | SQNS 2325 | SR 2326 | SRC 2327 | SRE 2328 | SRF 2329 | SRI 2330 | SRLP 2331 | SRT 2332 | SRV 2333 | SSD 2334 | SSE 2335 | SSI 2336 | SSL 2337 | SSLT 2338 | SSNI 2339 | SSP 2340 | SSS 2341 | SSTK 2342 | SSW 2343 | SSWN 2344 | ST 2345 | STAG 2346 | STAR 2347 | STAY 2348 | STC 2349 | STE 2350 | STI 2351 | STJ 2352 | STK 2353 | STL 2354 | STM 2355 | STN 2356 | STNG 2357 | STO 2358 | STON 2359 | STOR 2360 | STR 2361 | STRI 2362 | STT 2363 | STV 2364 | STWD 2365 | STZ 2366 | SU 2367 | SUI 2368 | SUN 2369 | SUNE 2370 | SUP 2371 | SVM 2372 | SVU 2373 | SWAY 2374 | SWC 2375 | SWFT 2376 | SWH 2377 | SWI 2378 | SWJ 2379 | SWK 2380 | SWM 2381 | SWN 2382 | SWU 2383 | SWX 2384 | SWY 2385 | SWZ 2386 | SXC 2387 | SXCP 2388 | SXE 2389 | SXI 2390 | SXL 2391 | SXT 2392 | SYA 2393 | SYF 2394 | SYK 2395 | SYT 2396 | SYX 2397 | SYY 2398 | SZC 2399 | T 2400 | TA 2401 | TAC 2402 | TAHO 2403 | TAI 2404 | TAL 2405 | TANN 2406 | TANO 2407 | TAOM 2408 | TAP 2409 | TARO 2410 | TBI 2411 | TC 2412 | TCAP 2413 | TCB 2414 | TCC 2415 | TCCA 2416 | TCI 2417 | TCK 2418 | TCO 2419 | TCP 2420 | TCPI 2421 | TCRX 2422 | TCS 2423 | TD 2424 | TDA 2425 | TDC 2426 | TDE 2427 | TDF 2428 | TDG 2429 | TDI 2430 | TDJ 2431 | TDS 2432 | TDW 2433 | TDY 2434 | TE 2435 | TEF 2436 | TEG 2437 | TEI 2438 | TEL 2439 | TEN 2440 | TEO 2441 | TEP 2442 | TER 2443 | TEU 2444 | TEVA 2445 | TEX 2446 | TFG 2447 | TFX 2448 | TG 2449 | TGH 2450 | TGI 2451 | TGP 2452 | TGS 2453 | TGT 2454 | THC 2455 | THG 2456 | THGA 2457 | THO 2458 | THQ 2459 | THR 2460 | THS 2461 | TI 2462 | TIF 2463 | TIME 2464 | TISI 2465 | TJX 2466 | TK 2467 | TKC 2468 | TKF 2469 | TKR 2470 | TLI 2471 | TLK 2472 | TLLP 2473 | TLM 2474 | TLP 2475 | TLYS 2476 | TM 2477 | TMH 2478 | TMHC 2479 | TMK 2480 | TMO 2481 | TMST 2482 | TMUS 2483 | TNC 2484 | TNET 2485 | TNH 2486 | TNK 2487 | TNP 2488 | TOL 2489 | TOO 2490 | TOT 2491 | TOWR 2492 | TPC 2493 | TPH 2494 | TPL 2495 | TPRE 2496 | TPUB 2497 | TPVG 2498 | TPX 2499 | TPZ 2500 | TR 2501 | TRC 2502 | TRCO 2503 | TREC 2504 | TREX 2505 | TRF 2506 | TRGP 2507 | TRI 2508 | TRK 2509 | TRLA 2510 | TRMR 2511 | TRN 2512 | TRNO 2513 | TROX 2514 | TRP 2515 | TRQ 2516 | TRR 2517 | TRUP 2518 | TRV 2519 | TRW 2520 | TS 2521 | TSE 2522 | TSI 2523 | TSL 2524 | TSLF 2525 | TSLX 2526 | TSM 2527 | TSN 2528 | TSNU 2529 | TSO 2530 | TSQ 2531 | TSS 2532 | TSU 2533 | TTC 2534 | TTF 2535 | TTI 2536 | TTM 2537 | TTP 2538 | TU 2539 | TUMI 2540 | TUP 2541 | TV 2542 | TVC 2543 | TVE 2544 | TVPT 2545 | TW 2546 | TWC 2547 | TWI 2548 | TWN 2549 | TWO 2550 | TWTR 2551 | TWX 2552 | TX 2553 | TXT 2554 | TXTR 2555 | TY 2556 | TYC 2557 | TYG 2558 | TYL 2559 | TZF 2560 | UA 2561 | UAL 2562 | UAM 2563 | UAN 2564 | UBA 2565 | UBP 2566 | UBS 2567 | UCP 2568 | UDR 2569 | UFI 2570 | UFS 2571 | UGI 2572 | UGP 2573 | UHS 2574 | UHT 2575 | UIL 2576 | UIS 2577 | UL 2578 | UMC 2579 | UMH 2580 | UN 2581 | UNF 2582 | UNH 2583 | UNM 2584 | UNP 2585 | UNT 2586 | UPL 2587 | UPS 2588 | URI 2589 | USA 2590 | USAC 2591 | USB 2592 | USDP 2593 | USG 2594 | USM 2595 | USNA 2596 | USPH 2597 | UTF 2598 | UTI 2599 | UTL 2600 | UTX 2601 | UVE 2602 | UVV 2603 | UZA 2604 | UZB 2605 | V 2606 | VAC 2607 | VAL 2608 | VALE 2609 | VAR 2610 | VBF 2611 | VC 2612 | VCO 2613 | VCRA 2614 | VCV 2615 | VEC 2616 | VEEV 2617 | VET 2618 | VFC 2619 | VG 2620 | VGI 2621 | VGM 2622 | VGR 2623 | VHI 2624 | VIPS 2625 | VIV 2626 | VJET 2627 | VKQ 2628 | VLO 2629 | VLP 2630 | VLRS 2631 | VLT 2632 | VLY 2633 | VMC 2634 | VMEM 2635 | VMI 2636 | VMO 2637 | VMW 2638 | VNCE 2639 | VNO 2640 | VNTV 2641 | VOC 2642 | VOYA 2643 | VPG 2644 | VPV 2645 | VR 2646 | VRS 2647 | VRTV 2648 | VRX 2649 | VSH 2650 | VSI 2651 | VSLR 2652 | VTA 2653 | VTN 2654 | VTR 2655 | VTRB 2656 | VTTI 2657 | VVC 2658 | VVI 2659 | VVR 2660 | VZ 2661 | VZA 2662 | W 2663 | WAB 2664 | WAC 2665 | WAGE 2666 | WAIR 2667 | WAL 2668 | WAT 2669 | WBAI 2670 | WBC 2671 | WBK 2672 | WBS 2673 | WCC 2674 | WCG 2675 | WCIC 2676 | WCN 2677 | WD 2678 | WDAY 2679 | WDR 2680 | WEA 2681 | WEC 2682 | WES 2683 | WEX 2684 | WF 2685 | WFC 2686 | WFT 2687 | WG 2688 | WGL 2689 | WGO 2690 | WGP 2691 | WHG 2692 | WHR 2693 | WHX 2694 | WHZ 2695 | WIA 2696 | WIT 2697 | WIW 2698 | WK 2699 | WLH 2700 | WLK 2701 | WLKP 2702 | WLL 2703 | WLT 2704 | WM 2705 | WMB 2706 | WMC 2707 | WMK 2708 | WMLP 2709 | WMS 2710 | WMT 2711 | WNC 2712 | WNR 2713 | WNRL 2714 | WNS 2715 | WOR 2716 | WPC 2717 | WPG 2718 | WPP 2719 | WPT 2720 | WPX 2721 | WPZ 2722 | WR 2723 | WRB 2724 | WRE 2725 | WRI 2726 | WRT 2727 | WSH 2728 | WSM 2729 | WSO 2730 | WSR 2731 | WST 2732 | WTI 2733 | WTM 2734 | WTR 2735 | WTS 2736 | WTW 2737 | WU 2738 | WUBA 2739 | WWAV 2740 | WWE 2741 | WWW 2742 | WX 2743 | WY 2744 | WYN 2745 | X 2746 | XCO 2747 | XEC 2748 | XEL 2749 | XIN 2750 | XKE 2751 | XL 2752 | XLS 2753 | XNY 2754 | XOM 2755 | XON 2756 | XOXO 2757 | XPO 2758 | XRM 2759 | XRS 2760 | XRX 2761 | XUE 2762 | XYL 2763 | Y 2764 | YDKN 2765 | YELP 2766 | YGE 2767 | YOKU 2768 | YPF 2769 | YUM 2770 | YUME 2771 | YZC 2772 | ZA 2773 | ZAYO 2774 | ZBK 2775 | ZEN 2776 | ZEP 2777 | ZF 2778 | ZFC 2779 | ZMH 2780 | ZNH 2781 | ZOES 2782 | ZPIN 2783 | ZQK 2784 | ZTR 2785 | ZTS 2786 | ZX -------------------------------------------------------------------------------- /src/generators/common_log.rs: -------------------------------------------------------------------------------- 1 | use crate::generators::Generator; 2 | use crate::Format; 3 | use chrono::{DateTime, Local}; 4 | use fake::faker::filesystem::en::FilePath; 5 | use fake::faker::internet::en::{UserAgent, Username, IP}; 6 | use fake::Fake; 7 | use rand::prelude::IteratorRandom; 8 | use rand::rngs::ThreadRng; 9 | use rand::Rng; 10 | use serde::Serialize; 11 | use std::fmt::Display; 12 | 13 | pub struct CommonLogGenerator { 14 | format: Format, 15 | rand: ThreadRng, 16 | } 17 | 18 | const ATTACKER: &str = "34.127.44.91"; 19 | 20 | #[derive(Debug, Serialize)] 21 | pub struct CommonLog { 22 | ip: String, 23 | identity: String, 24 | user_id: String, 25 | timestamp: DateTime, 26 | request: String, 27 | status_code: u16, 28 | size: u32, 29 | referer: String, 30 | user_agent: String, 31 | } 32 | 33 | const HTTP_METHODS: [&str; 4] = ["GET", "POST", "PUT", "DELETE"]; 34 | 35 | fn get_method(rng: &mut ThreadRng) -> &'static str { 36 | for method in HTTP_METHODS { 37 | if rng.gen_bool(0.9) { 38 | return method; 39 | } 40 | } 41 | 42 | HTTP_METHODS.last().unwrap() 43 | } 44 | 45 | const STATUS_CODES: [u16; 7] = [200u16, 400, 401, 403, 404, 405, 500]; 46 | 47 | fn get_status_code(rng: &mut ThreadRng) -> http::StatusCode { 48 | http::StatusCode::from_u16(*STATUS_CODES.iter().choose(rng).unwrap()).unwrap() 49 | } 50 | 51 | impl CommonLog { 52 | fn rand(rng: &mut ThreadRng) -> Self { 53 | let (ip, status_code) = if rng.gen_bool(0.05) { 54 | (ATTACKER.to_string(), http::StatusCode::UNAUTHORIZED) 55 | } else { 56 | (IP().fake_with_rng(rng), get_status_code(rng)) 57 | }; 58 | 59 | CommonLog { 60 | ip, 61 | identity: "-".to_string(), 62 | user_id: Username().fake_with_rng(rng), 63 | timestamp: Local::now(), 64 | request: format!( 65 | "{} {}", 66 | get_method(rng), 67 | FilePath().fake_with_rng::(rng) 68 | ), 69 | status_code: status_code.as_u16(), 70 | size: rng.gen_range(500..10000), 71 | referer: "-".to_string(), 72 | user_agent: UserAgent().fake_with_rng(rng), 73 | } 74 | } 75 | } 76 | 77 | impl Display for CommonLog { 78 | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { 79 | write!( 80 | f, 81 | "{} {} {} [{}] \"{}\" {} {} \"{}\" \"{}\"", 82 | self.ip, 83 | self.identity, 84 | self.user_id, 85 | self.timestamp.format("%d/%b/%Y:%H:%M:%S %z"), 86 | self.request, 87 | self.status_code, 88 | self.size, 89 | self.referer, 90 | self.user_agent, 91 | ) 92 | } 93 | } 94 | 95 | impl CommonLogGenerator { 96 | pub fn new(format: Format) -> CommonLogGenerator { 97 | CommonLogGenerator { 98 | format: format, 99 | rand: rand::thread_rng(), 100 | } 101 | } 102 | } 103 | 104 | impl Generator for CommonLogGenerator { 105 | fn generate(&mut self) -> Vec { 106 | let log = CommonLog::rand(&mut self.rand); 107 | match self.format { 108 | Format::String => log.to_string().into_bytes(), 109 | Format::Json => serde_json::to_vec(&log).unwrap(), 110 | } 111 | } 112 | } 113 | -------------------------------------------------------------------------------- /src/generators/mod.rs: -------------------------------------------------------------------------------- 1 | use crate::Format; 2 | use serde::Serialize; 3 | 4 | pub mod common_log; 5 | pub mod schematized; 6 | 7 | pub trait Generator { 8 | fn generate(&mut self) -> Vec; 9 | } 10 | 11 | pub struct ImpulseGen { 12 | counter: usize, 13 | format: Format, 14 | } 15 | 16 | impl ImpulseGen { 17 | pub fn new(format: Format) -> Self { 18 | ImpulseGen { counter: 0, format } 19 | } 20 | } 21 | 22 | #[derive(Serialize, Debug, Copy, Clone)] 23 | struct ImpulseData { 24 | id: usize, 25 | } 26 | 27 | impl Generator for ImpulseGen { 28 | fn generate(&mut self) -> Vec { 29 | let data = ImpulseData { id: self.counter }; 30 | self.counter += 1; 31 | 32 | match self.format { 33 | Format::String => format!("{}", data.id).into_bytes(), 34 | Format::Json => serde_json::to_vec(&data).unwrap(), 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/generators/schematized.rs: -------------------------------------------------------------------------------- 1 | use crate::generators::Generator; 2 | use crate::Format; 3 | use chrono::Local; 4 | use fake::faker::address::en::{CityName, StateAbbr, StreetName, ZipCode}; 5 | use fake::faker::internet::en::Username; 6 | use fake::faker::name::en::Name; 7 | use fake::{Fake, Faker}; 8 | use rand::prelude::SliceRandom; 9 | use rand::rngs::ThreadRng; 10 | use rand::Rng; 11 | use serde::Serialize; 12 | use std::fmt::Debug; 13 | use std::marker::PhantomData; 14 | use std::sync::OnceLock; 15 | 16 | const SYMBOLS: &str = include_str!("../../resources/symbols.txt"); 17 | 18 | static SYMBOLS_LIST: OnceLock> = OnceLock::new(); 19 | 20 | pub trait Schema: Debug + Serialize { 21 | fn generate(rng: &mut ThreadRng) -> Self; 22 | } 23 | 24 | #[derive(Debug, Clone, Serialize)] 25 | pub struct OrderRecord { 26 | pub order_id: u32, 27 | pub user_id: String, 28 | pub order_date: chrono::DateTime, 29 | pub total_amount: u64, 30 | 31 | pub name: String, 32 | pub address: String, 33 | pub city: String, 34 | pub state: String, 35 | pub zip: String, 36 | } 37 | 38 | impl Schema for OrderRecord { 39 | fn generate(rng: &mut ThreadRng) -> Self { 40 | OrderRecord { 41 | order_id: Faker.fake_with_rng(rng), 42 | user_id: Username().fake_with_rng(rng), 43 | order_date: Local::now(), 44 | total_amount: rng.gen_range(100..50000), 45 | name: Name().fake_with_rng(rng), 46 | address: format!( 47 | "{} {}", 48 | rng.gen_range(1..1000), 49 | StreetName().fake_with_rng::(rng) 50 | ), 51 | city: CityName().fake_with_rng(rng), 52 | state: StateAbbr().fake_with_rng(rng), 53 | zip: ZipCode().fake_with_rng(rng), 54 | } 55 | } 56 | } 57 | 58 | #[derive(Debug, Clone, Serialize)] 59 | pub struct StockTrade { 60 | pub user_id: String, 61 | pub account_id: usize, 62 | pub symbol: String, 63 | pub side: String, 64 | pub unit_price: u64, 65 | pub units: u32, 66 | pub timestamp: chrono::DateTime, 67 | } 68 | 69 | impl Schema for StockTrade { 70 | fn generate(rng: &mut ThreadRng) -> Self { 71 | let symbols = SYMBOLS_LIST.get_or_init(|| SYMBOLS.lines().collect()); 72 | 73 | StockTrade { 74 | user_id: Username().fake_with_rng(rng), 75 | account_id: rng.gen_range(1000..2000), 76 | symbol: symbols.choose(rng).unwrap().to_string(), 77 | side: if rng.gen_bool(0.5) { "buy" } else { "sell" }.to_string(), 78 | unit_price: rng.gen_range(1000..100000), 79 | units: rng.gen_range(1..100), 80 | timestamp: Local::now(), 81 | } 82 | } 83 | } 84 | 85 | pub struct SchemaGenerator { 86 | rand: ThreadRng, 87 | format: Format, 88 | _t: PhantomData, 89 | } 90 | 91 | impl SchemaGenerator { 92 | pub fn new(format: Format) -> Self { 93 | SchemaGenerator { 94 | format, 95 | rand: rand::thread_rng(), 96 | _t: PhantomData, 97 | } 98 | } 99 | } 100 | 101 | impl Generator for SchemaGenerator { 102 | fn generate(&mut self) -> Vec { 103 | let record = T::generate(&mut self.rand); 104 | 105 | match self.format { 106 | Format::String => format!("{:?}", record).into_bytes(), 107 | Format::Json => serde_json::to_vec(&record).unwrap(), 108 | } 109 | } 110 | } 111 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | mod generators; 2 | mod writers; 3 | 4 | use crate::generators::schematized::{OrderRecord, StockTrade}; 5 | use crate::generators::Generator; 6 | use crate::writers::kafka::KafkaConfig; 7 | use crate::writers::sse::SSEConfig; 8 | use crate::writers::stdout::StdoutConfig; 9 | use crate::writers::GenWriter; 10 | use clap::{Parser, Subcommand, ValueEnum}; 11 | use tracing_subscriber::layer::SubscriberExt; 12 | use tracing_subscriber::util::SubscriberInitExt; 13 | 14 | #[derive(Debug, Clone, Copy, ValueEnum)] 15 | pub enum Format { 16 | String, 17 | Json, 18 | } 19 | 20 | #[derive(Debug, Clone, Copy, ValueEnum)] 21 | pub enum GeneratorSpec { 22 | CommonLog, 23 | Impulse, 24 | Order, 25 | StockTrade, 26 | } 27 | 28 | impl GeneratorSpec { 29 | pub fn generator(&self, format: Format) -> Box { 30 | match self { 31 | GeneratorSpec::CommonLog => { 32 | Box::new(generators::common_log::CommonLogGenerator::new(format)) 33 | } 34 | GeneratorSpec::Impulse => Box::new(generators::ImpulseGen::new(format)), 35 | GeneratorSpec::Order => { 36 | Box::new(generators::schematized::SchemaGenerator::::new(format)) 37 | } 38 | GeneratorSpec::StockTrade => Box::new(generators::schematized::SchemaGenerator::< 39 | StockTrade, 40 | >::new(format)), 41 | } 42 | } 43 | } 44 | 45 | /// Generate realistic streaming data for testing stream processing applications 46 | #[derive(Parser)] 47 | #[command(author, version, about, long_about = None)] 48 | struct Cli { 49 | /// Type of data to generator 50 | spec: GeneratorSpec, 51 | 52 | /// Format of the generated data 53 | #[arg(short, long)] 54 | format: Option, 55 | 56 | /// Rate of generation in records per second 57 | #[arg(short, long)] 58 | rate: Option, 59 | 60 | /// Max number of records to generate 61 | #[arg(short, long)] 62 | limit: Option, 63 | 64 | /// Controls where the generated data is sent 65 | #[command(subcommand)] 66 | output: Option, 67 | } 68 | 69 | #[derive(Clone, Debug, Subcommand)] 70 | pub enum OutputCommand { 71 | /// Write outputs to stdout 72 | Stdout(StdoutConfig), 73 | /// Run a Server-Sent Events server 74 | SSE(SSEConfig), 75 | /// Write outputs to Kafka 76 | Kafka(KafkaConfig), 77 | } 78 | 79 | impl OutputCommand { 80 | pub fn writer(&self) -> Box { 81 | match self { 82 | OutputCommand::Stdout(config) => config.to_writer(), 83 | OutputCommand::SSE(config) => config.to_writer(), 84 | OutputCommand::Kafka(config) => config.to_writer(), 85 | } 86 | } 87 | } 88 | 89 | #[tokio::main] 90 | pub async fn main() { 91 | tracing_subscriber::registry() 92 | .with( 93 | tracing_subscriber::EnvFilter::try_from_default_env().unwrap_or_else(|_| "info".into()), 94 | ) 95 | .with(tracing_subscriber::fmt::layer().with_writer(std::io::stderr)) 96 | .init(); 97 | 98 | let cli = Cli::parse(); 99 | 100 | let mut generator = cli.spec.generator(cli.format.unwrap_or(Format::Json)); 101 | 102 | let mut writer = cli 103 | .output 104 | .unwrap_or(OutputCommand::Stdout(StdoutConfig {})) 105 | .writer(); 106 | 107 | let mut count = 0; 108 | while count < cli.limit.unwrap_or(usize::MAX) { 109 | let data = generator.generate(); 110 | writer.write(data).await; 111 | count += 1; 112 | 113 | tokio::time::sleep(std::time::Duration::from_secs_f32( 114 | 1.0 / cli.rate.unwrap_or(50.0), 115 | )) 116 | .await; 117 | } 118 | } 119 | -------------------------------------------------------------------------------- /src/writers/kafka/mod.rs: -------------------------------------------------------------------------------- 1 | #[cfg(feature = "kafka")] 2 | mod writer; 3 | 4 | use crate::writers::GenWriter; 5 | use clap::Args; 6 | 7 | #[derive(Clone, Debug, Args)] 8 | pub struct KafkaConfig { 9 | /// Kafka bootstrap servers 10 | #[arg(long)] 11 | bootstrap_servers: String, 12 | 13 | /// Kafka topic 14 | #[arg(long)] 15 | topic: String, 16 | 17 | /// Set Kafka options as key=value pairs 18 | #[arg(long)] 19 | options: Option>, 20 | } 21 | 22 | impl KafkaConfig { 23 | pub fn to_writer(&self) -> Box { 24 | #[cfg(feature = "kafka")] 25 | { 26 | Box::new(writer::KafkaWriter::new(self)) 27 | } 28 | 29 | #[cfg(not(feature = "kafka"))] 30 | { 31 | panic!("streamgen was not compiled with Kafka support; recompile with --features kafka to use this writer") 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/writers/kafka/writer.rs: -------------------------------------------------------------------------------- 1 | use crate::writers::kafka::KafkaConfig; 2 | use crate::writers::GenWriter; 3 | use async_trait::async_trait; 4 | use rdkafka::error::{KafkaError, RDKafkaErrorCode}; 5 | use rdkafka::producer::{DeliveryFuture, FutureProducer}; 6 | use std::time::Duration; 7 | use tracing::info; 8 | use uuid::Uuid; 9 | 10 | pub struct KafkaWriter { 11 | topic: String, 12 | future_producer: FutureProducer, 13 | } 14 | 15 | impl KafkaWriter { 16 | pub fn new(config: &KafkaConfig) -> Self { 17 | let mut client_config = rdkafka::ClientConfig::new(); 18 | client_config.set("bootstrap.servers", &config.bootstrap_servers); 19 | 20 | if let Some(options) = &config.options { 21 | for option in options { 22 | let parts: Vec<&str> = option.splitn(2, '=').collect(); 23 | if parts.len() != 2 { 24 | panic!("invalid option: {}", option); 25 | } 26 | client_config.set(parts[0].to_string(), parts[1].to_string()); 27 | } 28 | } 29 | 30 | let producer: FutureProducer = client_config.create().unwrap(); 31 | 32 | info!("Writing to kafka topic: {}...", config.topic); 33 | 34 | KafkaWriter { 35 | topic: config.topic.clone(), 36 | future_producer: producer, 37 | } 38 | } 39 | 40 | async fn publish(&mut self, data: Vec) -> DeliveryFuture { 41 | let key = Uuid::new_v4().to_string(); 42 | let mut record = rdkafka::producer::FutureRecord::to(&self.topic) 43 | .key(key.as_bytes()) 44 | .payload(&data); 45 | 46 | loop { 47 | match self.future_producer.send_result(record) { 48 | Ok(future) => { 49 | return future; 50 | } 51 | Err((KafkaError::MessageProduction(RDKafkaErrorCode::QueueFull), f)) => { 52 | record = f; 53 | } 54 | Err((e, _)) => { 55 | panic!("Unhandled kafka error: {:?}", e); 56 | } 57 | } 58 | 59 | // back off and retry 60 | tokio::time::sleep(Duration::from_millis(50)).await; 61 | } 62 | } 63 | } 64 | 65 | #[async_trait] 66 | impl GenWriter for KafkaWriter { 67 | async fn write(&mut self, data: Vec) { 68 | let future = self.publish(data).await; 69 | 70 | tokio::spawn(async move { 71 | match future.await { 72 | Ok(_) => {} 73 | Err(e) => { 74 | eprintln!("Error publishing to kafka: {:?}", e); 75 | } 76 | } 77 | }); 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /src/writers/mod.rs: -------------------------------------------------------------------------------- 1 | use async_trait::async_trait; 2 | 3 | pub mod kafka; 4 | pub mod sse; 5 | pub mod stdout; 6 | 7 | #[async_trait] 8 | pub trait GenWriter { 9 | async fn write(&mut self, data: Vec); 10 | } 11 | -------------------------------------------------------------------------------- /src/writers/sse.rs: -------------------------------------------------------------------------------- 1 | use crate::writers::GenWriter; 2 | use async_trait::async_trait; 3 | use axum::extract::State; 4 | use axum::response::sse::{Event, KeepAlive}; 5 | use axum::response::Sse; 6 | use axum::routing::get; 7 | use axum::Router; 8 | use clap::Args; 9 | use http::{HeaderMap, HeaderName}; 10 | use std::collections::BTreeMap; 11 | use std::convert::Infallible; 12 | use std::str::FromStr; 13 | use std::sync::Arc; 14 | use tokio::sync::broadcast; 15 | use tokio::sync::mpsc::Receiver; 16 | use tokio_stream::wrappers::BroadcastStream; 17 | use tokio_stream::{Stream, StreamExt}; 18 | use tracing::info; 19 | 20 | const MAX_HISTORY: usize = 10_000; 21 | 22 | pub struct SSEServer { 23 | event_stream: Receiver>, 24 | } 25 | 26 | #[derive(Clone, Debug, Args)] 27 | pub struct SSEConfig { 28 | /// Port for SSE server 29 | #[arg(long)] 30 | port: Option, 31 | } 32 | 33 | impl SSEConfig { 34 | pub fn to_writer(&self) -> Box { 35 | Box::new(SSEWriter::new(self.port.unwrap_or(9563))) 36 | } 37 | } 38 | 39 | #[derive(Clone)] 40 | pub struct ServerState { 41 | events: Arc>>>, 42 | rx: Arc)>>, 43 | } 44 | 45 | impl SSEServer { 46 | pub async fn start(mut self, port: u16) { 47 | let events = Arc::new(tokio::sync::Mutex::new(BTreeMap::new())); 48 | let (tx, rx) = broadcast::channel(10); 49 | 50 | { 51 | let events = events.clone(); 52 | let mut counter = 0; 53 | tokio::spawn(async move { 54 | while let Some(data) = self.event_stream.recv().await { 55 | { 56 | let mut events = events.lock().await; 57 | events.insert(counter, data.clone()); 58 | counter += 1; 59 | if counter > MAX_HISTORY { 60 | events.remove(&(counter - MAX_HISTORY)); 61 | } 62 | } 63 | 64 | tx.send((counter, data)).unwrap(); 65 | } 66 | }); 67 | } 68 | 69 | let state = ServerState { 70 | events, 71 | rx: Arc::new(rx), 72 | }; 73 | 74 | let app = Router::new() 75 | .route("/sse", get(sse_handler)) 76 | .with_state(state); 77 | 78 | // run it 79 | let listener = tokio::net::TcpListener::bind(format!("127.0.0.1:{}", port)) 80 | .await 81 | .unwrap(); 82 | info!("listening on {}", listener.local_addr().unwrap()); 83 | axum::serve(listener, app).await.unwrap(); 84 | } 85 | } 86 | 87 | async fn sse_handler( 88 | headers: HeaderMap, 89 | State(state): State, 90 | ) -> Sse>> { 91 | let last_event: Option = headers 92 | .get(HeaderName::from_str("Last-Event-ID").unwrap()) 93 | .iter() 94 | .flat_map(|hv| hv.to_str().ok()) 95 | .flat_map(|v| v.parse::().ok()) 96 | .next(); 97 | 98 | let mut rx: broadcast::Receiver<(usize, Vec)> = state.rx.resubscribe(); 99 | let (id, _) = rx.recv().await.unwrap(); 100 | 101 | let backfill: Vec<(usize, Vec)> = if let Some(last_event) = last_event { 102 | let events = state.events.lock().await; 103 | if events.contains_key(&last_event) { 104 | events 105 | .range(last_event..id) 106 | .map(|(id, record)| (*id, record.clone())) 107 | .collect() 108 | } else { 109 | vec![] 110 | } 111 | } else { 112 | vec![] 113 | }; 114 | 115 | let stream = tokio_stream::iter(backfill.into_iter()) 116 | .chain(BroadcastStream::new(rx).map(|t| t.unwrap())) 117 | .map(|(id, message)| { 118 | Ok(Event::default() 119 | .id(id.to_string()) 120 | .data(String::from_utf8(message).unwrap())) 121 | }); 122 | 123 | Sse::new(stream).keep_alive(KeepAlive::default()) 124 | } 125 | 126 | pub struct SSEWriter { 127 | tx: tokio::sync::mpsc::Sender>, 128 | } 129 | 130 | impl SSEWriter { 131 | pub fn new(port: u16) -> Self { 132 | let (tx, rx) = tokio::sync::mpsc::channel(1000); 133 | 134 | let server = SSEServer { event_stream: rx }; 135 | 136 | tokio::spawn(async move { 137 | server.start(port).await; 138 | }); 139 | 140 | SSEWriter { tx } 141 | } 142 | } 143 | 144 | #[async_trait] 145 | impl GenWriter for SSEWriter { 146 | async fn write(&mut self, data: Vec) { 147 | self.tx.send(data).await.unwrap(); 148 | } 149 | } 150 | -------------------------------------------------------------------------------- /src/writers/stdout.rs: -------------------------------------------------------------------------------- 1 | use crate::writers::GenWriter; 2 | use async_trait::async_trait; 3 | use clap::Args; 4 | use std::io::Write; 5 | 6 | pub struct StdoutWriter { 7 | stdout: std::io::Stdout, 8 | } 9 | 10 | #[derive(Clone, Debug, Args)] 11 | pub struct StdoutConfig {} 12 | 13 | impl StdoutConfig { 14 | pub fn to_writer(&self) -> Box { 15 | Box::new(StdoutWriter::new()) 16 | } 17 | } 18 | 19 | impl StdoutWriter { 20 | pub fn new() -> Self { 21 | StdoutWriter { 22 | stdout: std::io::stdout(), 23 | } 24 | } 25 | } 26 | 27 | #[async_trait] 28 | impl GenWriter for StdoutWriter { 29 | async fn write(&mut self, data: Vec) { 30 | self.stdout.write_all(&data).unwrap(); 31 | write!(self.stdout, "\n").unwrap(); 32 | } 33 | } 34 | --------------------------------------------------------------------------------