def call(env)
method = env.method.to_s.upcase
url = env.url
attrs = {
"http.request.method" => method,
"url.full" => url.to_s,
"server.address" => url.host,
"server.port" => url.port,
}
(@tracer || Sashiko.tracer).in_span(method, attributes: attrs, kind: :client) do |span|
response = @app.call(env)
span.set_attribute("http.response.status_code", response.status)
case response.status
in 100..399
in Integer => code
span.set_attribute("error.type", code.to_s)
span.status = OpenTelemetry::Trace::Status.error("HTTP #{code}")
end
response
rescue => e
span.set_attribute("error.type", e.class.name)
span.record_exception(e)
span.status = OpenTelemetry::Trace::Status.error(e.message)
raise
end
end