{"id":15137811,"url":"https://github.com/arnauld/haproxy-telemetry","last_synced_at":"2026-01-19T22:01:23.363Z","repository":{"id":40296291,"uuid":"488295730","full_name":"Arnauld/haproxy-telemetry","owner":"Arnauld","description":"HAproxy SPOA implementation in RUST - for open-telemetry","archived":false,"fork":false,"pushed_at":"2022-05-20T16:03:13.000Z","size":107,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-06T06:44:15.979Z","etag":null,"topics":["haproxy","open-telemetry","rust","spoa"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Arnauld.png","metadata":{"files":{"readme":"README.adoc","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-05-03T17:06:06.000Z","updated_at":"2022-10-06T12:53:43.000Z","dependencies_parsed_at":"2022-08-29T19:41:51.085Z","dependency_job_id":null,"html_url":"https://github.com/Arnauld/haproxy-telemetry","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Arnauld/haproxy-telemetry","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Arnauld%2Fhaproxy-telemetry","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Arnauld%2Fhaproxy-telemetry/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Arnauld%2Fhaproxy-telemetry/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Arnauld%2Fhaproxy-telemetry/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Arnauld","download_url":"https://codeload.github.com/Arnauld/haproxy-telemetry/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Arnauld%2Fhaproxy-telemetry/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28587043,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-19T20:45:59.482Z","status":"ssl_error","status_checked_at":"2026-01-19T20:45:41.500Z","response_time":67,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["haproxy","open-telemetry","rust","spoa"],"created_at":"2024-09-26T07:02:11.586Z","updated_at":"2026-01-19T22:01:23.341Z","avatar_url":"https://github.com/Arnauld.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# HAProxy Telemetry\r\n\r\n## HAProxy SPOE events/OTEL spans mapping\r\n\r\n[plantuml, target=overview, format=svg]\r\n....\r\n@startuml\r\nparticipant User\r\n\r\nUser -\u003e HAProxy: tcp\r\nactivate HAProxy\r\n\r\nHAProxy -\u003e SPOA: on-client-session\r\nactivate SPOA\r\nSPOA -\u003e \"SPAN/HAProxy session\"\r\nactivate \"SPAN/HAProxy session\"\r\n\"SPAN/HAProxy session\" -\u003e \"SPAN/Client session\": child-of\r\nactivate \"SPAN/Client session\"\r\nSPOA --\u003e HAProxy\r\ndeactivate SPOA\r\n\r\nHAProxy -\u003e SPOA: on-frontend-tcp-request\r\nactivate SPOA\r\nSPOA --\u003e \"SPAN/Client session\"\r\n\"SPAN/Client session\" -\u003e \"SPAN/Frontend TCP request\": child-of\r\nactivate \"SPAN/Frontend TCP request\"\r\nHAProxy -\u003e HAProxy: frontend/tcp-request content rules\r\nSPOA --\u003e HAProxy\r\ndeactivate SPOA\r\n\r\nHAProxy -\u003e SPOA: on-frontend-http-request\r\nactivate SPOA\r\nSPOA --\u003e \"SPAN/Frontend TCP request\"\r\n\"SPAN/Frontend TCP request\" -\u003e \"SPAN/Frontend HTTP request\": follows from\r\nactivate \"SPAN/Frontend HTTP request\"\r\ndeactivate \"SPAN/Frontend TCP request\"\r\nSPOA --\u003e HAProxy\r\ndeactivate SPOA\r\nHAProxy -\u003e HAProxy: frontend/http-request content rules\r\n\r\nHAProxy -\u003e SPOA: on-backend-tcp-request\r\nactivate SPOA\r\nSPOA --\u003e \"SPAN/Frontend HTTP request\"\r\n\"SPAN/Frontend HTTP request\" -\u003e \"SPAN/Backend TCP request\": follows from\r\nactivate \"SPAN/Backend TCP request\"\r\ndeactivate \"SPAN/Frontend HTTP request\"\r\nSPOA --\u003e HAProxy\r\ndeactivate SPOA\r\nHAProxy -\u003e HAProxy: backend/tcp-request content rules\r\n\r\nHAProxy -\u003e SPOA: on-backend-http-request\r\nactivate SPOA\r\nSPOA --\u003e \"SPAN/Backend TCP request\"\r\n\"SPAN/Backend TCP request\" -\u003e \"SPAN/Backend HTTP request\": follows from\r\nactivate \"SPAN/Backend HTTP request\"\r\ndeactivate \"SPAN/Backend TCP request\"\r\nSPOA --\u003e HAProxy\r\ndeactivate SPOA\r\nHAProxy -\u003e HAProxy: backend/http-request content rules\r\n\r\nHAProxy -\u003e SPOA: on-server-session\r\nactivate SPOA\r\nSPOA --\u003e \"SPAN/HAProxy session\"\r\n\"SPAN/HAProxy session\" -\u003e \"SPAN/Server session\": child-of\r\nactivate \"SPAN/Server session\"\r\nSPOA --\u003e \"SPAN/Backend HTTP request\"\r\ndeactivate \"SPAN/Backend HTTP request\"\r\nSPOA --\u003e HAProxy\r\ndeactivate SPOA\r\n\r\nHAProxy -\u003e SPOA: on-tcp-response\r\nactivate SPOA\r\nSPOA --\u003e \"SPAN/Server session\"\r\n\"SPAN/Server session\" -\u003e \"SPAN/TCP response\": child of\r\nactivate \"SPAN/TCP response\"\r\nSPOA --\u003e HAProxy\r\ndeactivate SPOA\r\n\r\n\r\nHAProxy -\u003e SPOA: on-http-response\r\nactivate SPOA\r\nSPOA --\u003e \"SPAN/TCP response\"\r\n\"SPAN/TCP response\" -\u003e \"SPAN/HTTP response\"\r\nactivate \"SPAN/HTTP response\"\r\ndeactivate \"SPAN/TCP response\"\r\nSPOA --\u003e \"SPAN/Server session\"\r\ndeactivate \"SPAN/Server session\"\r\nSPOA --\u003e \"SPAN/HTTP response\"\r\ndeactivate \"SPAN/HTTP response\"\r\nSPOA --\u003e \"SPAN/Client session\"\r\ndeactivate \"SPAN/Client session\"\r\nSPOA --\u003e \"SPAN/HAProxy session\"\r\ndeactivate \"SPAN/HAProxy session\"\r\nSPOA --\u003e HAProxy\r\ndeactivate SPOA\r\n\r\n\r\nHAProxy -\u003e User: http/response\r\n\r\n\r\ndeactivate HAProxy\r\n\r\n@enduml\r\n....\r\n\r\n## Development setup\r\n\r\n### Overview\r\n\r\n[ditaa, target=ditaa, format=svg]\r\n....\r\n      |     |\r\n      |     |\r\n  7001v     v8001\r\n  +-----------------+\r\n  | HAProxy~1       |\r\n  |                 |\r\n  |        +------+ |\r\n  |        | SPOE | |\r\n  |        +----+-+ |\r\n  |             |   |\r\n  |             v   |\r\n  | +----+----+-----+\r\n  | |    |    | cBLU|\r\n  +-+-+--+--+-+--+--+             +-------------------+\r\n      |     |    |                | 700x with SPOA {d}|\r\n      |     |    \\-------\\        | 800x no SPOA  cFE7|\r\n  7002v     v8002        |        +-------------------/\r\n  +-----------------+    |\r\n  | HAProxy~2       |    |\r\n  |                 |    |\r\n  |        +------+ |    |       (devenv/conf/haproxy~2.conf)\r\n  |        | SPOE | |    |       (devenv/conf/spoe.cfg)\r\n  |        +----+-+ |    |\r\n  |             |   |    |\r\n  |   backends  v   |    |\r\n  |   +-------+-----+    |\r\n  |   |       | cBLU|    |   +-------------+\r\n  +---+--+----+--+--+    \\--\u003e|    SPOA     |\r\n         |       |     :7000 |             |\r\n         |       +----------\u003e|        cBLU |\r\n         |          SPOP     +-----+-------+\r\n         |                         |\r\n   :8080 v                         v\r\n  +------------+             +-------------+\r\n  | FakeServer +------------\u003e| OTEL/jaeger |\r\n  +------------+             +-------------+\r\n....\r\n\r\n### Start local setup\r\n\r\nStart local `haproxy` + `fake-server` + `jaeger`\r\n\r\n[source,bash]\r\n....\r\ncd devenv/\r\ndocker-compose up -d\r\ncurl http://localhost:7000\r\n....\r\n\r\n[cols=\"1,2\"]\r\n|===\r\n| Jaeger UI\r\n| http://localhost:16686/\r\n\r\n| HAProxy stats\r\n| http://localhost:7004/;norefresh\r\n\r\n| Rust SPOA\r\n| :7001\r\n\r\n|===\r\n\r\n### Start SPOA\r\n\r\n[source,bash]\r\n....\r\nRUST_BACKTRACE=1 cargo run\r\n....\r\n\r\n## Resources\r\n\r\n* SPOP specifications: http://www.haproxy.org/download/2.6/doc/SPOE.txt\r\n* _\"Official\"_ HAProxy SPOA \"sample\" (in c): https://github.com/haproxy/spoa-example\r\n* _\"Official\"_ HAProxy SPOA open tracing \"sample\" (in c): https://github.com/haproxytech/spoa-opentracing\r\n* HAProxy SPOA example (in rust): https://github.com/vkill/haproxy-spoa-example\r\n* \"Extending HAProxy with the Stream Processing Offload Engine\" : https://www.haproxy.com/fr/blog/extending-haproxy-with-the-stream-processing-offload-engine/\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farnauld%2Fhaproxy-telemetry","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Farnauld%2Fhaproxy-telemetry","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farnauld%2Fhaproxy-telemetry/lists"}