/operation/tracing.llms.txt
Tracing & logging
eRPC instruments every layer of the request pipeline — inbound HTTP, routing, cache lookups, upstream calls — and exports those spans over OTLP to any OpenTelemetry-compatible backend. Structured JSON logs run at five verbosity levels, secrets are redacted before any line is written, and a force-trace override lets you capture full detail for a single network or method without touching global sampling.
What you get
- End-to-end distributed traces from caller through every upstream hop
- Two span tiers: always-on for data-plane ops, detailed for high-cardinality debug info
- Force-trace by request header, query param, or config pattern — even at
sampleRate: 0 - Automatic secret redaction for all API keys and passwords in logs and config dumps
- W3C TraceContext propagation: eRPC becomes a child of your caller's trace
Quick taste
Illustrative, not a tuned production config — 10 % sampling, gRPC export:
tracing: enabled: true # OTLP gRPC collector — eRPC always overrides OTEL_EXPORTER_OTLP_ENDPOINT endpoint: localhost:4317 protocol: grpc # 10 % ambient sampling — sampleRate: 0 is rewritten to 1.0 by SetDefaults, use enabled: false to disable sampleRate: 0.1 serviceName: erpc-prodAgent reference
Copy one of these prompts into your AI agent session (Claude Code, Cursor, …) — each one points the agent at this page's machine-readable reference so it can do the work correctly:
Prompt Example #1: wire eRPC traces to my OTel collector
Set up distributed tracing in my eRPC instance so every request, cache lookup, and upstream call produces spans exported to my OpenTelemetry collector. Work with my existing eRPC config. and my collector is at otel-collector:4317. Choose a sensible production sample rate and explain the sampleRate: 0 footgun. Read the full reference first: https://docs.erpc.cloud/operation/tracing.llms.txt
Prompt Example #2: force full traces on debug methods only
I want eRPC to sample at 5% normally but always capture 100% traces for debug_* and trace_* methods so I can triage slow calls without raising global sample rate. Update my eRPC config with the right forceTraceMatchers config. Reference: https://docs.erpc.cloud/operation/tracing.llms.txt
Prompt Example #3: send traces to Grafana Cloud with auth
Configure eRPC's OTLP exporter in my eRPC config to send traces to my Grafana Cloud OTLP HTTP endpoint with bearer-token auth headers and TLS enabled. Include the sample rate and serviceName settings appropriate for production. Reference: https://docs.erpc.cloud/operation/tracing.llms.txt
Prompt Example #4: debug missing or noisy spans
My tracing backend shows either no spans from eRPC or too many after a config change. Diagnose the issue in my eRPC config — check sampleRate zero-rewrite, OTEL env var overrides, and detailed mode cost — and fix the config so I get the spans I expect. Reference: https://docs.erpc.cloud/operation/tracing.llms.txt
Tracing & logging — full agent referenceExpand for every option, default, and edge case — or copy this entire section into your AI assistant.
How it works
Tracing initialization. On startup, NewERPC calls common.InitializeTracing exactly
once (guarded by sync.Once). When enabled, it builds an OTLP exporter (gRPC via
otlptracegrpc or HTTP via otlptracehttp), constructs a TracerProvider with a batcher
and a custom sampler, wires W3C TraceContext + Baggage propagation, and stores any
forceTraceMatchers for per-request evaluation. Two package-level booleans —
IsTracingEnabled and IsTracingDetailed — are set once and consulted on every hot-path
span call with zero allocation when tracing is off.
[common/tracing_core.go:L53-148]
Two span tiers. All instrumented call sites use one of two helpers:
StartSpan— fires wheneverIsTracingEnabled; covers major external interactions: cache, upstreams, connectors, rate limiters, consensus.StartDetailSpan— fires only when bothIsTracingEnabledandIsTracingDetailed; covers eRPC-internal operations and spans carrying high-cardinality attributes such as request params, block numbers, lock contention, and hook execution. Enablingdetailed: trueroughly doubles span count.
When tracing is disabled, both helpers return the caller's unchanged context and a singleton
noopSpan — no allocation on the hot path.
[common/tracing_util.go:L1-234]
Span hierarchy for a single HTTP request (normal mode):
Http.ReceivedRequest (SpanKindServer)
└─ Request.Handle (SpanKindInternal)
└─ Network.Forward
└─ Network.forwardAttempt
├─ Cache.Get
└─ Upstream.Forward
└─ HttpJsonRpcClient.sendSingleRequestWith detailed: true, additional spans appear inside the HTTP layer (Http.ReadBody,
Http.ParseRequests, HttpServer.WriteResponse), between Forward and forwardAttempt
(Project.Forward, Network.TryForward, Network.UpstreamLoop), and inside upstream
execution (RateLimiter.TryAcquirePermit, Upstream.tryForward.PreRequest,
Upstream.tryForward.SendRequest), cache lookup, lock/parse ops, and method-specific hooks.
Sampler logic. createTracingSampler builds the base sampler from sampleRate:
<= 0→NeverSample()>= 1.0→AlwaysSample()- otherwise →
ParentBased(TraceIDRatioBased(rate))with all four parent-sampling options configured for consistency (no orphan spans)
The forceTraceSampler always wraps the base sampler regardless of rate.
[common/tracing_core.go:L229-268]
Force-trace mechanism. Three paths can force a span to be recorded regardless of
sampleRate:
- HTTP header
X-ERPC-Force-Trace: true(or1,yes) — checked at request entry. - Query parameter
?force-trace=true— same check. - Config-driven
forceTraceMatchers— evaluated after the URL is parsed and the network is known. Each matcher can specifynetwork(inarchitecture:chainIdform, e.g.evm:1) and/ormethod(JSON-RPC method pattern). Pipe (|) = OR; wildcards supported. Both fields present on one matcher = AND semantics.
In all cases, the force-trace decision is communicated to the OTel sampler by setting the
span attribute erpc.force_trace = true at creation time. The custom forceTraceSampler
wraps the base sampler and returns RecordAndSample unconditionally when it sees this
attribute — even when sampleRate: 0.
[common/tracing_core.go:L257-268]
Context propagation. Incoming HTTP requests have traceparent/tracestate extracted via
W3C TraceContext{} carrier, making eRPC spans children of the caller's trace. After the
response is written, InjectHTTPResponseTraceContext injects the active span context back
into response headers so downstream callers can correlate their traces. gRPC requests have
no OTel trace extraction — they start with a fresh root span.
[common/tracing_util.go:L58-74]
Logging system. zerolog is the structured JSON logger used throughout eRPC. Default output is newline-delimited JSON with Unix-millisecond timestamps:
{"level":"info","time":1718000000123,"message":"...","key":"value"}Set LOG_WRITER=console to switch to a human-readable format for local development:
04:05.000ms INF message key=valueFive levels are available: trace, debug, info, warn, error (plus fatal,
panic, disabled). LOG_LEVEL environment variable overrides logLevel config at
startup and again when the config is loaded, so it always wins. ERPC_NOLOGS=1 silences all
output at the binary level.
When the resolved level is info or lower, eRPC serializes the entire loaded config as a
JSON field in a startup log line. All secrets are redacted before this serialization.
Secret redaction. Two layers:
-
MarshalJSON/MarshalYAMLoverrides on config types — called whenever config is serialized — replace secret fields with"REDACTED"or applyutil.RedactEndpoint:Config type Field Replacement RedisConnectorConfigpassword"REDACTED"RedisConnectorConfiguriutil.RedactEndpoint(uri)PostgreSQLConnectorConfigconnectionUriutil.RedactEndpoint(connectionUri)AwsAuthConfigsecretAccessKey"REDACTED"ProviderConfigsettings"REDACTED"UpstreamConfigendpointutil.RedactEndpoint(endpoint)SecretStrategyConfigvalue"REDACTED" -
util.RedactEndpoint— computes a SHA-256 of the full original URL, takes the first 5 hex chars as a stable identifier, then strips path and credentials according to scheme:- Native-protocol endpoints (
alchemyv2://,erigon://, etc.):scheme://host#redacted=<hash> - Envio-suffix schemes:
scheme://host(no hash needed — no secrets in path) - Repository-suffix schemes:
scheme://host#redacted=<hash> - Standard
http/httpsRPC endpoints:scheme#redacted=<hash>— hostname is also dropped - Unparseable URL:
"redacted=<hash>"
Two endpoints with the same scheme but different paths (API keys) produce different hashes, enabling correlation without exposing secrets.
- Native-protocol endpoints (
OTel resource attributes. The TracerProvider is built with a resource that includes
service.name (from tracing.serviceName), service.version (the compiled-in ErpcVersion
constant), commit.sha (the compiled-in ErpcCommitSha constant), and any key/value pairs
from tracing.resourceAttributes. Environment variables in resourceAttributes values are
expanded via os.ExpandEnv at config load; empty values after expansion are silently skipped.
[common/tracing_core.go:L93-102]
The OTel instrumentation name registered by eRPC is "github.com/erpc/erpc".
[common/tracing_core.go:L26]
Error recording. SetTraceSpanError checks span.IsRecording() before acting. For
StandardError types it sets an error.code span attribute (the full error-code chain) and
records the error as a span event; for plain error values it calls span.RecordError and
sets the span status to codes.Error.
[common/tracing_core.go:L163-183]
Force-flush. common.ForceFlushTraces(ctx) calls tracerProvider.ForceFlush(ctx),
flushing all batched but not-yet-exported spans to the collector immediately. It is called
automatically on graceful shutdown and exposed for callers that need guaranteed delivery of
critical traces.
[common/tracing_core.go:L237-245]
Graceful shutdown. A goroutine watches appCtx.Done and flushes buffered spans with a
5-second grace period before the process exits.
[erpc/erpc.go:L92-99]
Config schema
Top-level logLevel
| Field | Type | Default | Behavior / footguns |
|---|---|---|---|
logLevel | string | "INFO" (common/defaults.go:L50-51) | Controls log verbosity for all eRPC subsystems. Valid: trace, debug, info, warn, error, fatal, panic, disabled (case-insensitive). Invalid value → warning + fallback to debug (erpc/init.go:L27-32). Overridden by LOG_LEVEL env var at config-load time (cmd/erpc/main.go:L354-363). |
tracing.*
Full struct: common/config.go:L218-235.
| Field | Type | Default | Behavior / footguns |
|---|---|---|---|
tracing.enabled | bool | false (Go zero value) | Master switch. When false, sets IsTracingEnabled = false globally; all span calls are no-ops (common/tracing_core.go:L53-58). |
tracing.endpoint | string | "localhost:4317" (gRPC) or "http://localhost:4318" (HTTP) — derived from protocol in SetDefaults (common/defaults.go:L622-628) | OTLP collector endpoint. gRPC: host:port with no scheme. HTTP: full URL including scheme. Footgun: OTEL_EXPORTER_OTLP_ENDPOINT is always overridden by this field even when it holds the default value. |
tracing.protocol | TracingProtocol | "grpc" (common/defaults.go:L619-621) | "grpc" uses otlptracegrpc; "http" uses otlptracehttp. Any other value → error at init (common/tracing_core.go:L71-78). |
tracing.sampleRate | float64 | 1.0 (common/defaults.go:L629-631) | <= 0 → NeverSample(), >= 1.0 → AlwaysSample(), otherwise → ParentBased(TraceIDRatioBased(rate)). Footgun: SetDefaults replaces 0 with 1.0, so sampleRate: 0 in YAML means "always sample", not "never sample". To keep tracing on but silent, use a very small positive value like 0.0000001. |
tracing.detailed | bool | false (Go zero value) | When true, sets IsTracingDetailed = true, enabling StartDetailSpan calls. Roughly 2× span count. Includes request params, block numbers, lock spans, hook execution spans. |
tracing.serviceName | string | "erpc" (common/defaults.go:L632-634) | OTel service.name resource attribute. |
tracing.headers | map[string]string | nil | Additional metadata headers sent with every OTLP export batch. Used for auth to managed collectors (Grafana Cloud, Honeycomb, Datadog). When set, takes precedence over OTEL_EXPORTER_OTLP_HEADERS. |
tracing.tls.enabled | bool | false (Go zero value) | Master switch for TLS on the OTLP exporter. When false, exporters are created with WithInsecure() (common/tracing_core.go:L187). |
tracing.tls.certFile | string | "" | Path to PEM client certificate for mTLS. Both certFile and keyFile must be non-empty; supplying one without the other silently skips mutual TLS. |
tracing.tls.keyFile | string | "" | Path to PEM private key corresponding to certFile. Required alongside certFile for mTLS. |
tracing.tls.caFile | string | "" | Path to PEM CA certificate. When set, the collector's server cert is validated against this CA instead of the system pool. |
tracing.tls.insecureSkipVerify | bool | false | When true, disables verification of the OTLP collector's server cert. Does not affect client-cert loading. Only for development or trusted private networks. |
tracing.resourceAttributes | map[string]string | nil | Custom OTel resource attributes. Values are os.ExpandEnv-expanded at config load. Empty values after expansion are silently skipped (common/tracing_core.go:L93-97). |
tracing.forceTraceMatchers | []*ForceTraceMatcher | nil | Matchers that bypass sampleRate and force RecordAndSample. |
tracing.forceTraceMatchers[].network | string | — | Network pattern in architecture:chainId form, e.g. "evm:1", "evm:1|evm:42161", "evm:*". Pipe = OR; wildcards via WildcardMatch. |
tracing.forceTraceMatchers[].method | string | — | JSON-RPC method pattern, e.g. "eth_call", "debug_*|trace_*". Pipe = OR; wildcards supported. |
ForceTraceMatcher AND/OR semantics: when both network and method are specified on one
matcher, both must match (AND). If only one field is set, only that field is checked. An
empty matcher (neither field) never matches (common/tracing_core.go:L306-330).
Standard OTEL_* environment variables
| Env var | Interaction with eRPC config |
|---|---|
OTEL_EXPORTER_OTLP_ENDPOINT | Overridden. eRPC always passes WithEndpoint(cfg.Endpoint); this env var is silently ignored. |
OTEL_EXPORTER_OTLP_HEADERS | Partially overridden. Only takes effect when tracing.headers is nil/empty in config. |
OTEL_SERVICE_NAME | Not explicitly overridden, but eRPC always sets service.name. eRPC builds its resource with semconv.ServiceNameKey.String(cfg.ServiceName). If the OTel SDK's default detectors also read OTEL_SERVICE_NAME, last-writer-wins resource merge semantics apply; eRPC's explicit value is always present. |
OTEL_TRACES_SAMPLER | Ignored. eRPC supplies its own sampler via explicit SDK option. |
OTEL_PROPAGATORS | Ignored. eRPC explicitly sets TraceContext + Baggage propagators. |
OTEL_SDK_DISABLED | Honored. Disables all OTel SDK operations globally before InitializeTracing runs. |
Worked examples
1. Production setup: 10 % sampling with force-trace on debug methods. Low ambient cost; debug-namespace calls always produce a full trace for triage:
tracing: enabled: true endpoint: otel-collector:4317 protocol: grpc sampleRate: 0.1 serviceName: erpc-prod forceTraceMatchers: - method: "debug_*|trace_*"2. Detailed mode for a staging environment. Capture every span including request params, block numbers, and lock contention to understand slow calls — not recommended in production due to 2× span volume:
tracing: enabled: true endpoint: tempo:4317 sampleRate: 1.0 detailed: true serviceName: erpc-staging3. Managed collector with auth headers and TLS. For Grafana Cloud or Honeycomb where the OTLP endpoint requires a bearer token:
tracing: enabled: true endpoint: "https://otlp-gateway.grafana.net/otlp" protocol: http sampleRate: 0.05 headers: Authorization: "Basic <base64-token>"4. Silent tracing for force-trace-only capture. Keep tracing on but produce no ambient
spans — only requests that carry X-ERPC-Force-Trace: true or match a configured matcher
are recorded. Use sampleRate: 0.0000001 because sampleRate: 0 is rewritten to 1.0 by
SetDefaults:
tracing: enabled: true endpoint: localhost:4317 sampleRate: 0.0000001 forceTraceMatchers: - network: "evm:1" method: "eth_call"Request/response behavior
- Incoming HTTP requests with
traceparent/tracestateheaders become children of the caller's trace. eRPC spans are nested under the caller's root span. - After the response is written, the active span's W3C context is injected back into
HTTP response headers unconditionally — including error responses. Trace IDs are
observable to callers. [
erpc/http_server.go:L701] - For batch HTTP requests, each item gets its own
Request.Handlechild span under a singleHttp.ReceivedRequestparent. All child spans may be in-flight simultaneously. [erpc/http_server.go:L465] - gRPC requests start a fresh root span — no trace context extraction is implemented for
the gRPC server path. [
erpc/grpc_server.go] - OTLP export failures are logged at
tracelevel only and never propagate to callers. [common/tracing_core.go:L125-127] Request.Handleis started viatracer.Startdirectly (notStartSpan), so it fires wheneverIsTracingEnabled, regardless ofIsTracingDetailed. This is the correct attach point for distributed callers. [common/tracing_util.go:L165]
Span attributes on Request.Handle (set by StartRequestSpan/EndRequestSpan):
| Attribute | Mode | Value |
|---|---|---|
request.method | always | JSON-RPC method name |
erpc.force_trace | always, when forced | true (bool, internal — used by sampler to force RecordAndSample; not a user-visible exported attribute) |
erpc.forced_trace_reason | when forced | "header_or_query" or "network:<n>,method:<m>" etc. |
request.id | detailed only | JSON-RPC request ID as string |
request.jsonrpc.params | detailed only | JSON-serialized params array |
network.id | detailed only, on response | Network ID string |
user.id | detailed only, on response | Auth user ID |
request.finality | detailed only, on response | Finality label (e.g. "realtime", "finalized") |
response.finality | detailed only, on response | Response finality |
execution.attempts | detailed only, on response | Total attempts |
execution.retries | detailed only, on response | Number of retries |
execution.hedges | detailed only, on response | Number of hedges |
response.result_size | detailed only, on response | Length of JSON-RPC result field |
upstream.id | always (if non-nil), on response | Upstream identifier |
cache.hit | always (if non-nil), on response | bool: whether response was served from cache |
Span attributes on Http.ReceivedRequest (set by StartHTTPServerSpan/EnrichHTTPServerSpan):
| Attribute | Phase | Value |
|---|---|---|
http.method | on request | HTTP method (semconv) |
http.url | on request | Full request URL |
http.scheme | on request | URL scheme |
http.user_agent | on request | User-Agent header value |
erpc.force_trace | on request, when forced | true (if forced via header/query) |
erpc.forced_trace_reason | on request, when forced | "header_or_query" |
http.status_code | on response | HTTP response status code (semconv) |
[common/tracing_util.go:L80-138]
Best practices
- Set
sampleRate: 0.05–0.2in production —AlwaysSample()at scale sends enormous span volume to your collector. - Use
forceTraceMatcherswithmethod: "debug_*|trace_*"to guarantee full traces on expensive diagnostic methods regardless of sample rate — this costs nothing extra for normal traffic. - Never set
sampleRate: 0thinking it means "disabled" —SetDefaultsrewrites it to1.0. Useenabled: falseto disable tracing entirely. - Enable
detailed: trueonly in staging or on-demand: 2× span count and high-cardinality attributes (params, block numbers) can saturate a collector or inflate storage costs. - Always set
tracing.endpointexplicitly — do not rely onOTEL_EXPORTER_OTLP_ENDPOINTto route spans to a remote collector; eRPC overrides it unconditionally. - Enable
tracing.tls.enabled: truefor any span export that leaves a trusted network; the default isWithInsecure(). - Force-trace via the
X-ERPC-Force-Trace: truerequest header during integration testing to capture full detail without raising global sample rate.
Edge cases & gotchas
initOnce.Domeans tracing config cannot change after firstNewERPC. Tests or multi-tenant code creating multiple ERPC instances will silently use only the first instance's tracing config. Source:common/tracing_core.go:L53sampleRate: 0in YAML means "always sample", not "never sample".SetDefaultsreplaces0with1.0. To keep tracing enabled but silent, set0.0000001or a very small positive value. Source:common/defaults.go:L629-631- Force-trace network matching requires URL parsing to have succeeded.
forceTraceMatcherswithnetworkpatterns never match admin or healthcheck requests. Source:erpc/http_server.go:L285-288 - W3C traceparent injection into HTTP responses is unconditional when tracing is enabled
— including error responses. Trace IDs are observable to callers. Source:
erpc/http_server.go:L701 - gRPC server has no OTel trace extraction. gRPC-originated requests start with a fresh
root span, not as children of the caller's trace. Source:
erpc/grpc_server.go - TLS on the OTLP exporter is off by default. Both gRPC and HTTP exporters use
WithInsecure()unlesstracing.tls.enabled: true. Production deployments sending spans over the internet should enable TLS. Source:common/tracing_core.go:L187 OTEL_EXPORTER_OTLP_ENDPOINTis silently overridden. eRPC always callsWithEndpoint(cfg.Endpoint), so this env var has no effect. Settracing.endpointin config explicitly. Source:common/tracing_core.go:L197OTEL_TRACES_SAMPLERandOTEL_PROPAGATORShave no effect. eRPC supplies its own sampler and propagator via explicit SDK options. Source:common/tracing_core.go:L109OTEL_EXPORTER_OTLP_HEADERSonly takes effect whentracing.headersis nil/empty in config. Source:common/tracing_core.go:L200-202util.RedactEndpointdrops the entire hostname for standard http/https URLs. An endpoint likehttps://eth-mainnet.alchemyapi.io/v2/SECRETbecomeshttps#redacted=ab3c4. Only native-protocol and repository-type endpoints keepscheme://host. Source:util/redact.go:L32-34LOG_LEVELenv var is applied twice — once globally before config load, and again whengetConfigoverridescfg.LogLevel. The second application persists into the running instance and always wins over the YAMLlogLevel. Source:cmd/erpc/main.go:L354-363- OTel debug logging (zerologr bridge) is wired only at tracing init time. If zerolog
level is not
<= DebugwhenInitializeTracingruns, OTel SDK internals are never logged, even if you lower the level later via the admin API. Source:common/tracing_core.go:L119-122 console.errorin TypeScript config scripts throwsTypeError. Onlydebug,info,log,trace, andwarnare registered in the Sobek runtime. Source:common/console.go:L15-21
Observability
There are no Prometheus metrics emitted by the tracing or logging subsystem. The tracing
pipeline is a pure OTel concern; OTLP export errors are logged at trace level only and do
not increment any counter.
Notable log messages:
| Level | Message | When |
|---|---|---|
| info | "OpenTelemetry tracing is disabled" | tracing.enabled = false |
| info | "initializing OpenTelemetry tracing" + endpoint/protocol/sampleRate/detailed | Before exporter creation |
| info | "OpenTelemetry debug logging enabled" | Only if zerolog level ≤ debug at init time |
| info | "OpenTelemetry tracing initialized successfully" | After successful init |
| info | "force-trace matcher configured" + index/network/method | Once per configured matcher |
| trace | "open telemetry export error" | OTLP export failure |
| error | "failed to create span exporter" | Exporter init failure |
| error | "failed to create resource" | OTel resource build failure |
| error | "failed to initialize tracing" | From NewERPC when InitializeTracing errors |
| error | "failed to shutdown tracer provider" | On process shutdown |
| warn | "invalid log level '%s', defaulting to 'debug'" | Unrecognized logLevel value |
| info | (empty message, config JSON field) | Startup when level ≤ info: full redacted config dump |
OTel span name inventory. "normal" = emitted when tracing.enabled; "detail" = emitted
only when tracing.enabled && tracing.detailed; "direct" = calls tracer.Start directly
(same threshold as normal). OTel instrumentation name: "github.com/erpc/erpc".
All 126 span names (expand)
| Span name | Mode | Call site |
|---|---|---|
Cache.FindGetPolicies | detail | architecture/evm/json_rpc_cache.go:L173 |
Cache.Get | normal | architecture/evm/json_rpc_cache.go:L153 |
Cache.GetForPolicy | detail | architecture/evm/json_rpc_cache.go:L241 |
Cache.Set | normal | architecture/evm/json_rpc_cache.go:L572 |
ConnectorFailsafe.Delete | detail | data/failsafe.go:L286 |
ConnectorFailsafe.Get | detail | data/failsafe.go:L224 |
ConnectorFailsafe.Set | detail | data/failsafe.go:L253 |
Consensus.CollectResponses | detail | consensus/executor.go:L189 |
Consensus.Run | normal | consensus/executor.go:L1282 |
CounterInt64.TryUpdate | normal | data/shared_state_variable.go:L365 |
CounterInt64.TryUpdateIfStale | normal | data/shared_state_variable.go:L391 |
CounterInt64.TryUpdateIfStale.AcquireMutex | normal | data/shared_state_variable.go:L405 |
CounterInt64.TryUpdateIfStale.ExecuteRefresh | normal | data/shared_state_variable.go:L430 |
DynamoDBConnector.Delete | normal | data/dynamodb.go:L833 |
DynamoDBConnector.Get | normal | data/dynamodb.go:L414 |
DynamoDBConnector.List | normal | data/dynamodb.go:L874 |
DynamoDBConnector.Lock | normal | data/dynamodb.go:L579 |
DynamoDBConnector.Set | normal | data/dynamodb.go:L355 |
DynamoDBConnector.Unlock | normal | data/dynamodb.go:L691 |
DynamoDBConnector.getSimpleValue | detail | data/dynamodb.go:L766 |
Evm.ExtractBlockReferenceFromRequest | detail | architecture/evm/block_ref.go:L19 |
Evm.ExtractBlockReferenceFromResponse | detail | architecture/evm/block_ref.go:L118 |
Evm.ExtractBlockTimestampFromResponse | detail | architecture/evm/block_ref.go:L191 |
Evm.PickHighestBlock | detail | architecture/evm/eth_getBlockByNumber.go:L336 |
Evm.extractRefFromJsonRpcRequest | detail | architecture/evm/block_ref.go:L240 |
Evm.extractRefFromJsonRpcResponse | detail | architecture/evm/block_ref.go:L314 |
EvmStatePoller.PollFinalizedBlockNumber | detail | architecture/evm/evm_state_poller.go:L491 |
EvmStatePoller.PollLatestBlockNumber | detail | architecture/evm/evm_state_poller.go:L394 |
GrpcBdsClient.GetBlockByHash | detail | clients/grpc_bds_client.go:L365 |
GrpcBdsClient.GetBlockByNumber | detail | clients/grpc_bds_client.go:L422 |
GrpcBdsClient.GetLogs | detail | clients/grpc_bds_client.go:L632 |
GrpcBdsClient.QueryBlocks | detail | clients/grpc_bds_client.go:L1097 |
GrpcBdsClient.QueryLogs | detail | clients/grpc_bds_client.go:L1173 |
GrpcBdsClient.QueryTraces | detail | clients/grpc_bds_client.go:L1209 |
GrpcBdsClient.QueryTransactions | detail | clients/grpc_bds_client.go:L1138 |
GrpcBdsClient.QueryTransfers | detail | clients/grpc_bds_client.go:L1245 |
GrpcBdsClient.SendRequest | normal | clients/grpc_bds_client.go:L194 |
Http.ParseRequests | detail | erpc/http_server.go:L397 |
Http.ReadBody | detail | erpc/http_server.go:L373 |
Http.ReceivedRequest | normal | common/tracing_util.go:L96 |
HttpJsonRpcClient.sendSingleRequest | normal | clients/http_json_rpc_client.go:L675 |
HttpServer.WriteResponse | detail | erpc/http_server.go:L680 |
JsonRpcRequest.Lock | detail | common/json_rpc.go:L1229 |
JsonRpcRequest.RLock | detail | common/json_rpc.go:L1235 |
JsonRpcResponse.IsResultEmptyish | detail | common/json_rpc.go:L799 |
JsonRpcResponse.ParseFromStream | detail | common/json_rpc.go:L288 |
JsonRpcResponse.PeekBytesByPath | detail | common/json_rpc.go:L486 |
JsonRpcResponse.PeekStringByPath | detail | common/json_rpc.go:L464 |
Multiplexer.Close | detail | erpc/multiplexer.go:L37 |
Network.EnrichStatePoller | detail | erpc/networks.go:L2146 |
Network.EvmHighestFinalizedBlockNumber | detail | erpc/networks.go:L679 |
Network.EvmHighestLatestBlockNumber | detail | erpc/networks.go:L518 |
Network.EvmLowestFinalizedBlockNumber | detail | erpc/networks.go:L855 |
Network.Forward | normal | erpc/networks.go:L943 |
Network.GetFinality | detail | erpc/networks.go:L1646 |
Network.NormalizeResponse | detail | erpc/networks.go:L2235 |
Network.PostForward.eth_getBlockByNumber | detail | architecture/evm/eth_getBlockByNumber.go:L44 |
Network.PostForward.eth_sendRawTransaction | detail | architecture/evm/eth_sendRawTransaction.go:L280 |
Network.PostForwardHook | detail | architecture/evm/hooks.go:L64 |
Network.PreForwardHook | detail | architecture/evm/hooks.go:L41 |
Network.PreForwardHook.eth_chainId | detail | architecture/evm/eth_chainId.go:L79 |
Network.TryForward | detail | erpc/networks.go:L1137 |
Network.UpstreamLoop | detail | erpc/networks.go:L1227 |
Network.WaitForMultiplexResult | normal | erpc/networks.go:L2058 |
Network.forwardAttempt | normal | erpc/networks.go:L1188 |
PolicyEngine.GetOrdered | detail | erpc/networks.go:L1023 |
PostgreSQLConnector.Delete | normal | data/postgresql.go:L1130 |
PostgreSQLConnector.Get | normal | data/postgresql.go:L466 |
PostgreSQLConnector.List | normal | data/postgresql.go:L1165 |
PostgreSQLConnector.Lock | normal | data/postgresql.go:L526 |
PostgreSQLConnector.PublishCounterInt64 | normal | data/postgresql.go:L683 |
PostgreSQLConnector.Set | normal | data/postgresql.go:L409 |
PostgreSQLConnector.Unlock | normal | data/postgresql.go:L589 |
PostgreSQLConnector.getCurrentValue | detail | data/postgresql.go:L974 |
PostgreSQLConnector.getWithWildcard | detail | data/postgresql.go:L1006 |
Project.Forward | detail | erpc/projects.go:L103 |
Project.PreForwardHook | detail | architecture/evm/hooks.go:L14 |
Project.PreForwardHook.eth_blockNumber | detail | architecture/evm/eth_blockNumber.go:L16 |
Project.PreForwardHook.eth_chainId | detail | architecture/evm/eth_chainId.go:L30 |
Project.executeShadowRequest | detail | erpc/shadow.go:L82 |
Query.Execute | detail | erpc/query_executor.go:L45 |
Query.ForwardSubrequest | detail | erpc/query_shim.go:L427 |
Query.ResolveQueryBounds | detail | erpc/query_executor.go:L277 |
Query.ShimBlocks | detail | erpc/query_shim.go:L18 |
Query.ShimLogs | detail | erpc/query_shim.go:L112 |
Query.ShimTraces | detail | erpc/query_shim.go:L187 |
Query.ShimTransactions | detail | erpc/query_shim.go:L55 |
QueryStream.Handle | normal | erpc/request_processor.go:L76 |
RateLimiter.DoLimit | normal | upstream/ratelimiter_budget.go:L279 |
RateLimiter.TryAcquirePermit | detail | upstream/ratelimiter_budget.go:L161 |
RedisConnector.Delete | normal | data/redis.go:L636 |
RedisConnector.Get | normal | data/redis.go:L341 |
RedisConnector.List | normal | data/redis.go:L682 |
RedisConnector.Lock | normal | data/redis.go:L435 |
RedisConnector.PublishCounterInt64 | normal | data/redis.go:L558 |
RedisConnector.Set | normal | data/redis.go:L281 |
RedisConnector.Unlock | normal | data/redis.go:L612 |
Request.GenerateCacheHash | detail | common/json_rpc.go:L1387 |
Request.Handle | direct | common/tracing_util.go:L165 |
Request.Lock | detail | common/request.go:L925 |
Request.RLock | detail | common/request.go:L931 |
Request.ResolveJsonRpc | detail | common/request.go:L939 |
Response.IsObjectNull | detail | common/response.go:L420 |
Response.Lock | detail | common/response.go:L84 |
Response.RLock | detail | common/response.go:L90 |
Response.ResolveJsonRpc | detail | common/response.go:L293 |
Upstream.Forward | normal | upstream/upstream.go:L416 |
Upstream.PostForwardHook | detail | architecture/evm/hooks.go:L110 |
Upstream.PostForwardHook.eth_getBlockByNumber | detail | architecture/evm/eth_getBlockByNumber.go:L435 |
Upstream.PostForwardHook.eth_getBlockReceipts | detail | architecture/evm/eth_getBlockReceipts.go:L31 |
Upstream.PostForwardHook.eth_getLogs | detail | architecture/evm/eth_getLogs.go:L350 |
Upstream.PostForwardHook.eth_sendRawTransaction | detail | architecture/evm/eth_sendRawTransaction.go:L59 |
Upstream.PostForwardHook.trace_filter | detail | architecture/evm/trace_filter.go:L362 |
Upstream.PreForwardHook | detail | architecture/evm/hooks.go:L87 |
Upstream.PreForwardHook.eth_chainId | detail | architecture/evm/eth_chainId.go:L124 |
Upstream.PreForwardHook.eth_getLogs | detail | architecture/evm/eth_getLogs.go:L289 |
Upstream.PreForwardHook.trace_filter | detail | architecture/evm/trace_filter.go:L298 |
Upstream.tryForward.PreRequest | detail | upstream/upstream.go:L572 |
Upstream.tryForward.SendRequest | detail | upstream/upstream.go:L630 |
UpstreamsRegistry.GetNetworkUpstreams | detail | upstream/registry.go:L349 |
UpstreamsRegistry.GetSortedUpstreams | detail | upstream/registry.go:L387 |
UpstreamsRegistry.buildProviderBootstrapTask | detail | upstream/registry.go:L485 |
UpstreamsRegistry.buildUpstreamBootstrapTask | detail | upstream/registry.go:L431 |
createSyntheticSuccessResponse | detail | architecture/evm/eth_sendRawTransaction.go:L179 |
extractTxHashFromSendRawTransaction | detail | architecture/evm/eth_sendRawTransaction.go:L136 |
verifyAndHandleNonceTooLow | detail | architecture/evm/eth_sendRawTransaction.go:L206 |
Source code entry points
common/tracing_core.go:L53-L170(opens in a new tab) —InitializeTracing: exporter creation, sampler construction, propagator setup,forceTraceSampler,IsTracingEnabled/IsTracingDetailedglobalscommon/tracing_util.go:L1-L234(opens in a new tab) —noopSpansingleton,StartSpan/StartDetailSpanhelpers,StartHTTPServerSpan,StartRequestSpan/EndRequestSpan,InjectHTTPResponseTraceContextcommon/defaults.go:L618-L637(opens in a new tab) —TracingConfig.SetDefaults: protocol, endpoint, sampleRate, serviceNamecommon/config.go:L218-L235(opens in a new tab) —TracingConfigstruct definitioncommon/config.go:L397-L503(opens in a new tab) —MarshalJSON/MarshalYAMLredaction overrides for secret-bearing config typesutil/redact.go:L10-L36(opens in a new tab) —RedactEndpoint: SHA-256-based URL sanitization with scheme-aware rulescmd/erpc/main.go:L48-L66(opens in a new tab) — zerolog global setup:TimeFieldFormat,ErrorMarshalFunc,LOG_WRITERconsole mode,LOG_LEVELenv overrideerpc/erpc.go:L31-L99(opens in a new tab) — callsInitializeTracingon startup, registers shutdown goroutine with 5-second grace perioderpc/http_server.go:L285-L288(opens in a new tab) — network context for force-trace matcher evaluationerpc/http_server.go:L701(opens in a new tab) — W3C traceparent injection into HTTP response headerserpc/init.go:L27-L42(opens in a new tab) — parsescfg.LogLevelinto zerolog level; logs full redacted config at info levelcommon/console.go:L15-L29(opens in a new tab) — JS/TSconsole.{debug,info,log,trace,warn}→ zerolog bridge (note:console.erroris absent)common/runtime.go:L39(opens in a new tab) — installsconsoleobject into every Sobek runtimecmd/erpc/initflags.go(opens in a new tab) —ERPC_NOLOGS=1→ zerolog.Disabled + io.Discard writer (build-tagged, non-test only)
Related pages
- Metrics & Prometheus — the Prometheus side of observability; no overlap with OTel spans.
- Admin API — runtime log-level changes via the admin endpoint.
- Health checks — healthcheck requests bypass force-trace network matchers.
- Deployment — how to wire an OTel collector sidecar alongside eRPC.