Skip to content

Instantly share code, notes, and snippets.

@ftnext
Last active February 21, 2026 14:57
Show Gist options
  • Select an option

  • Save ftnext/0285c562352d1f1b5b7aafcbcb9ea4e2 to your computer and use it in GitHub Desktop.

Select an option

Save ftnext/0285c562352d1f1b5b7aafcbcb9ea4e2 to your computer and use it in GitHub Desktop.
# https://github.com/ftnext/2026-slides/blob/ef721a71a3dec9a414e5e05de1def3448f0f1272/samplecode/deep-research-otel/gemini.rb
require "faraday"
require "json"
require "opentelemetry/sdk"
require "opentelemetry/instrumentation/faraday"
ENV["OTEL_TRACES_EXPORTER"] = "console"
OpenTelemetry::SDK.configure do |c|
c.use 'OpenTelemetry::Instrumentation::Faraday'
end
class OtelBodyCaptureMiddleware < Faraday::Middleware
def call(env)
span = OpenTelemetry::Trace.current_span
if span&.recording?
body = env.body
body_str = body.is_a?(String) ? body : JSON.generate(body)
span.set_attribute("http.request.body", body_str)
end
response = @app.call(env)
if span&.recording?
span.set_attribute("http.response.body", response.body.to_s)
end
response
end
end
api_key = ENV["GEMINI_API_KEY"]
conn = Faraday.new(
url: "https://generativelanguage.googleapis.com"
) do |f|
f.adapter Faraday.default_adapter
end
conn.builder.insert_after(
OpenTelemetry::Instrumentation::Faraday::Middlewares::Old::TracerMiddleware,
OtelBodyCaptureMiddleware
)
response = conn.post(
"/v1beta/models/gemini-3-flash-preview:generateContent"
) do |req|
req.headers["Content-type"] = "application/json"
req.headers["x-goog-api-key"] = api_key
req.body = {
contents: [
{
parts: [
{ text: "OpenTelemetry について短い詩を書いてください。" }
]
}
]
}.to_json
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment