{"id":37116727,"url":"https://github.com/fd/go-http-instrument","last_synced_at":"2026-01-14T13:40:45.145Z","repository":{"id":57482114,"uuid":"94898083","full_name":"fd/go-http-instrument","owner":"fd","description":null,"archived":false,"fork":true,"pushed_at":"2017-06-20T14:51:19.000Z","size":10,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-12-13T07:17:38.822Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"orian/go-http-instrument","license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fd.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-06-20T14:06:38.000Z","updated_at":"2017-06-20T14:06:40.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/fd/go-http-instrument","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/fd/go-http-instrument","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fd%2Fgo-http-instrument","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fd%2Fgo-http-instrument/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fd%2Fgo-http-instrument/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fd%2Fgo-http-instrument/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fd","download_url":"https://codeload.github.com/fd/go-http-instrument/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fd%2Fgo-http-instrument/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28421561,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T13:30:50.153Z","status":"ssl_error","status_checked_at":"2026-01-14T13:29:08.907Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: 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":[],"created_at":"2026-01-14T13:40:44.488Z","updated_at":"2026-01-14T13:40:45.137Z","avatar_url":"https://github.com/fd.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Simple Go `net/http` instrumentation for Prometheus\n\nThis library is a fork of Prometheus golang_client/prometheus/http handler proxy:\nhttps://github.com/prometheus/client_golang/blob/master/prometheus/http.go#L152\n\nThe documentation of `InstrumentHandler` mentions the following problems:\n```\n - It uses Summaries rather than Histograms. Summaries are not useful if\n aggregation across multiple instances is required.\n\n - It uses microseconds as unit, which is deprecated and should be replaced by\n seconds.\n\n - The size of the request is calculated in a separate goroutine. Since this\n calculator requires access to the request header, it creates a race with\n any writes to the header performed during request handling.\n httputil.ReverseProxy is a prominent example for a handler\n performing such writes.\n\n```\n\nThe first two problems are mitigated. The third one is hard and as a moment of writing \nI didn't find a need to implement it, thus for a sake of race condition detection it\nwas disabled.\n\nAdditionally a gauge `inflight_requests` was added.\n\nThe histogram buckets: \n\n```\n    []float64{0.05, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7,\n              0.8, 0.9, 1., 2., 5., 10., 20., 30., 40., 50.}\n```\n\n## Get the library:\n```\ngo get github.com/orian/go-http-instrument/instrumentation\n```\n\n## For developers\nFor a testing purposes I've prepared a super simple http server to run in Docker. \n\nThe `bin` directory contains a trivial binary. To compile:\n\n```\ncd bin\nCGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o simpleserver simpleserver.go\n```\n\nThan one needs to execute:\n\n```\ndocker build -t instrument/demoserver .\ndocker run --rm -it --net promnet -p 8080:8080 \\\n    --name httpexample instrument/demoserver\n```\n\nPrometheus:\n```\ndocker pull prom/prometheus\n\ndocker run --rm -it -p 9090:9090 --net promnet \\ \n    --name prom -v $PWD/prom/prometheus.yaml:/etc/prometheus/prometheus.yml \\\n    prom/prometheus\n```\n\nTo see changes in metrics run some queries. The demo server accepts two query params:\n  \n  - `dur` - how long the request should take.\n  - `code` - what HTTP status code to return.\n\n```\ncurl -v \"localhost:8080/\" \u0026\ncurl -v \"localhost:8080/?code=404\u0026dur=1.5\" \u0026\ncurl -v \"localhost:8080/?code=404\u0026dur=15\" \u0026\ncurl -v \"localhost:8080/?dur=105\" \u0026\ncurl -v \"localhost:8080/?code=500\u0026dur=50\" \u0026 \ncurl -v \"localhost:8080/?dur=34\" \u0026\ncurl -v \"localhost:8080/?dur=20\" \u0026\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffd%2Fgo-http-instrument","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffd%2Fgo-http-instrument","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffd%2Fgo-http-instrument/lists"}