Skip to content

fix(protocol): never sweep or evict this node's own node-table row - #65

Merged
xzyaoi merged 1 commit into
mainfrom
fix/self-row-sweep
Oct 14, 2026
Merged

xzyaoi merged 1 commit into
mainfrom
fix/self-row-sweep

Conversation

@xzyaoi

@xzyaoi xzyaoi commented Oct 14, 2026

Copy link
Copy Markdown
Collaborator

Problem

/v1/dnt/bootstraps kept going empty in production within minutes of every head-node restart, despite MarkSelfAsBootstrap correctly re-registering the head's row (with public_address) at startup.

Root cause

Three behaviors compose into a self-deleting row on every service-less head:

  1. The 30-second liveness tick deliberately skips self, and ReannounceLocalServices only fires on service/reconnect events — so a head's own row keeps the last_seen it got at startup, forever.
  2. The 2-minute staleness sweep (decideSweepAction with probeUnknown) marks any connected, service-less row whose last_seen is older than peerDisconnectAfter (2 min) as disconnected, then deletes it after peerStaleAfter (10 min).
  3. Nothing re-registers the row except a process restart (MarkSelfAsBootstrap runs once, from P2PListener).

Net effect: every head disconnects itself from its own table ~2 min after boot, deletes its row ~12 min in, and /v1/dnt/bootstraps (which only advertises rows carrying a public_address) returns {"bootstraps":[]} until the next restart — which repeats the cycle.

Note POST /v1/dnt/_node cannot rescue it: the CRDT PutHook deliberately ignores the node's own key, so that path never reaches the in-memory table.

Fix

Skip the local node's own row in both maintenance passes:

  • clock.go — the 2-min sweep always keeps our own row (our own liveness is not in question; remote peers refresh our row on their side via their liveness pings).
  • liveness.go — probeUnreachableServicePeers never probes/evicts ourselves: a relay-reservation hiccup must not retire this node from its own table.

Evidence (production, ocf-1 head @ 140.238.223.116)

  • Journal 2026-10-10 15:16:41: Registering as bootstrap node (row written with public address) → row absent from /v1/dnt/table and bootstraps empty shortly after.
  • Stock v0.2.6: row reliably gone within the 2 min + 10 min sweep windows after every start.
  • Patched build (3b48011-sweepfix): head row alive and connected >15 min after restart (past the full kill window), NRestarts=0, and /v1/dnt/bootstraps stays populated: https://bootstraps.opentela.ai/v1/dnt/bootstraps

Testing

  • go vet ./internal/protocol/ clean; go test ./internal/protocol/ passes.
  • Deployed and verified on a live production head (see above).

The 2-minute staleness sweep retires any connected, service-less row whose
last_seen is older than peerDisconnectAfter (2 min) and deletes it after
peerStaleAfter (10 min). The 30-second liveness tick deliberately skips
self, and a service-less head never runs ReannounceLocalServices (it only
fires on service events), so the head's own row — written once at startup
by MarkSelfAsBootstrap — keeps its last_seen frozen at boot time. Every
head therefore disconnected itself from its own table ~2 minutes after
starting and deleted the row ~12 minutes in, silently emptying
/v1/dnt/bootstraps until the next restart re-registered it and repeated
the cycle.

Skip the local node's own row in both maintenance passes:
- clock.go 2-min sweep: always keep our own row regardless of staleness
- probeUnreachableServicePeers: never probe/evict ourselves; a relay
  reservation hiccup must not retire this node from its own table

Remote peers still refresh our row on their side via their liveness pings,
so no real staleness exemption is lost by this change.

Observed in production on the ocf-1 head (v0.2.6, 2026-10-10): the row
registered at startup was swept within minutes and /v1/dnt/bootstraps
returned {"bootstraps":[]} from then on. With this change the row survives
past the full disconnect+delete window and the list stays populated.
Copilot AI balanced review requested due to automatic review settings October 14, 2026 18:54

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@github-actions

Copy link
Copy Markdown

Test Coverage Report 📊

Click to view detailed coverage
opentela/entry/cmd/boot.go:43:					bootInstanceLink			80.0%
opentela/entry/cmd/boot.go:75:					bootAccount				70.7%
opentela/entry/cmd/init.go:21:					ensureLibp2pKey				85.7%
opentela/entry/cmd/init.go:131:					writeDefaultConfig			0.0%
opentela/entry/cmd/instance_link.go:59:				nodeLinkSigner				78.9%
opentela/entry/cmd/instance_link.go:97:				resolveAPIBaseURL			66.7%
opentela/entry/cmd/instance_link.go:109:			resolveDeployKey			100.0%
opentela/entry/cmd/instance_link.go:116:			runInstanceLink				81.5%
opentela/entry/cmd/instance_link.go:166:			peerIDFromPriv				75.0%
opentela/entry/cmd/instance_link.go:176:			explainInstanceLinkError		44.4%
opentela/entry/cmd/instance_link.go:199:			init					100.0%
opentela/entry/cmd/probe.go:77:					init					100.0%
opentela/entry/cmd/root.go:37:					init					97.9%
opentela/entry/cmd/root.go:98:					configFilePath				85.7%
opentela/entry/cmd/root.go:113:					initConfig				89.4%
opentela/entry/cmd/root.go:319:					Execute					0.0%
opentela/entry/cmd/start.go:56:					init					100.0%
opentela/entry/cmd/update.go:13:				doUpdate				0.0%
opentela/entry/cmd/wallet.go:234:				runWalletBalance			0.0%
opentela/entry/cmd/wallet.go:289:				addWalletBalanceFlags			100.0%
opentela/entry/cmd/wallet.go:412:				init					100.0%
opentela/entry/cmd/wallet_link.go:57:				runWalletLink				0.0%
opentela/entry/cmd/wallet_link.go:109:				obtainJWT				0.0%
opentela/entry/cmd/wallet_link.go:141:				promptPassword				0.0%
opentela/entry/cmd/wallet_link.go:159:				explainLinkError			0.0%
opentela/entry/cmd/wallet_link.go:183:				explainSignInError			0.0%
opentela/entry/cmd/wallet_link.go:197:				init					100.0%
opentela/entry/main.go:18:					main					0.0%
opentela/internal/account/link.go:59:				Error					0.0%
opentela/internal/account/link.go:81:				httpClient				100.0%
opentela/internal/account/link.go:90:				doJSON					82.8%
opentela/internal/account/link.go:143:				LinkWallet				90.0%
opentela/internal/account/link.go:209:				LinkInstance				82.4%
opentela/internal/account/link.go:249:				SignInEmail				74.5%
opentela/internal/account/resolve.go:27:			UnmarshalJSON				93.3%
opentela/internal/account/resolve.go:71:			GetAccount				100.0%
opentela/internal/account/resolve.go:88:			HasWallet				100.0%
opentela/internal/account/resolve.go:120:			GetBilling				85.7%
opentela/internal/analytics/aggregator.go:89:			newAggregator				100.0%
opentela/internal/analytics/aggregator.go:98:			add					94.7%
opentela/internal/analytics/aggregator.go:134:			flush					100.0%
opentela/internal/analytics/config.go:19:			Normalize				100.0%
opentela/internal/analytics/recorder.go:26:			New					100.0%
opentela/internal/analytics/recorder.go:41:			run					87.5%
opentela/internal/analytics/recorder.go:58:			Begin					100.0%
opentela/internal/analytics/recorder.go:71:			End					100.0%
opentela/internal/analytics/recorder.go:84:			Observe					100.0%
opentela/internal/analytics/recorder.go:96:			FlushNow				0.0%
opentela/internal/analytics/recorder.go:104:			flushNow				85.7%
opentela/internal/analytics/recorder.go:118:			Stop					100.0%
opentela/internal/analytics/reservoir.go:18:			newReservoir				66.7%
opentela/internal/analytics/reservoir.go:25:			add					100.0%
opentela/internal/analytics/reservoir.go:37:			len					100.0%
opentela/internal/analytics/reservoir.go:39:			mean					100.0%
opentela/internal/analytics/reservoir.go:52:			percentile				83.3%
opentela/internal/analytics/rollup.go:6:			ratio					100.0%
opentela/internal/analytics/rollup.go:13:			perSecond				66.7%
opentela/internal/analytics/rollup.go:22:			buildEvent				100.0%
opentela/internal/analytics/sink.go:32:				Enqueue					100.0%
opentela/internal/analytics/sink.go:38:				Close					0.0%
opentela/internal/analytics/sink.go:40:				Snapshot				100.0%
opentela/internal/analytics/sink.go:51:				Enqueue					0.0%
opentela/internal/analytics/sink.go:52:				Close					0.0%
opentela/internal/analytics/sink.go:59:				NewPostHogSink				33.3%
opentela/internal/analytics/sink.go:75:				Enqueue					0.0%
opentela/internal/analytics/sink.go:93:				Close					0.0%
opentela/internal/analytics/usage_parse.go:16:			ParseUsage				100.0%
opentela/internal/attestation/attestation.go:66:		configuredPubKeyHexes			100.0%
opentela/internal/attestation/attestation.go:87:		trustedPubKeys				85.0%
opentela/internal/attestation/attestation.go:123:		attestationMessage			100.0%
opentela/internal/attestation/attestation.go:130:		Verify					92.3%
opentela/internal/attestation/attestation.go:156:		Sign					100.0%
opentela/internal/attestation/cmd/buildsign/main.go:22:		main					0.0%
opentela/internal/attestation/cmd/buildsign/main.go:39:		keygen					0.0%
opentela/internal/attestation/cmd/buildsign/main.go:51:		sign					0.0%
opentela/internal/common/constants.go:10:			GetHomePath				63.6%
opentela/internal/common/constants.go:27:			GetDBPath				100.0%
opentela/internal/common/filesystem.go:7:			RemoveDir				100.0%
opentela/internal/common/logger.go:11:				init					100.0%
opentela/internal/common/logger.go:15:				InitLogger				48.0%
opentela/internal/common/logger.go:61:				ReportError				50.0%
opentela/internal/common/process/manager.go:13:			NewProcessManager			100.0%
opentela/internal/common/process/manager.go:20:			StartProcess				0.0%
opentela/internal/common/process/manager.go:27:			StopAllProcesses			0.0%
opentela/internal/common/process/manager.go:33:			StartCriticalProcess			57.1%
opentela/internal/common/process/manager.go:44:			HealthCheck				50.0%
opentela/internal/common/process/process.go:36:			NewProcess				100.0%
opentela/internal/common/process/process.go:63:			Start					94.4%
opentela/internal/common/process/process.go:93:			SetTimeout				66.7%
opentela/internal/common/process/process.go:101:		Wait					100.0%
opentela/internal/common/process/process.go:105:		awaitOutput				100.0%
opentela/internal/common/process/process.go:111:		Kill					100.0%
opentela/internal/common/process/process.go:120:		OpenInputStream				71.4%
opentela/internal/common/process/process.go:133:		StreamOutput				77.8%
opentela/internal/common/process/process.go:151:		finishTimeOutOrDie			87.5%
opentela/internal/common/process/process.go:169:		cleanup					100.0%
opentela/internal/common/process/process.go:181:		isRunning				0.0%
opentela/internal/common/requests.go:12:			RemoteGET				52.6%
opentela/internal/common/serialization.go:5:			DictionaryToBytes			100.0%
opentela/internal/common/utils.go:3:				DeduplicateStrings			100.0%
opentela/internal/ingest/server.go:40:				Run					0.0%
opentela/internal/ingest/server.go:70:				collectStats				0.0%
opentela/internal/metrics/collector.go:20:			NewAggregatedCollector			100.0%
opentela/internal/metrics/collector.go:38:			Describe				0.0%
opentela/internal/metrics/collector.go:42:			Collect					88.9%
opentela/internal/metrics/collector.go:58:			SetNetworkStats				100.0%
opentela/internal/metrics/collector.go:63:			SetScraperTargets			100.0%
opentela/internal/metrics/collector.go:67:			metricFromDTO				91.7%
opentela/internal/metrics/peer_provider.go:15:			GetScrapablePeers			0.0%
opentela/internal/metrics/peer_provider.go:42:			extractServices				100.0%
opentela/internal/metrics/peer_provider.go:57:			buildPeerLabels				100.0%
opentela/internal/metrics/relabeler.go:12:			Relabel					100.0%
opentela/internal/metrics/relabeler.go:53:			sanitizeMetricName			75.0%
opentela/internal/metrics/scraper.go:54:			NewMetricsScraper			100.0%
opentela/internal/metrics/scraper.go:83:			Start					0.0%
opentela/internal/metrics/scraper.go:99:			Stop					0.0%
opentela/internal/metrics/scraper.go:103:			GetCachedMetrics			100.0%
opentela/internal/metrics/scraper.go:114:			GetSelfMetrics				0.0%
opentela/internal/metrics/scraper.go:118:			scrapeAll				100.0%
opentela/internal/metrics/scraper.go:145:			scrapePeer				72.7%
opentela/internal/metrics/scraper.go:166:			scrapeTarget				84.6%
opentela/internal/metrics/scraper.go:189:			parseMetrics				84.6%
opentela/internal/metrics/scraper.go:210:			evictStale				85.7%
opentela/internal/platform/gpu.go:10:				GetGPUInfo				75.0%
opentela/internal/platform/gpu.go:18:				getNvidiaGPUs				26.3%
opentela/internal/platform/gpu.go:48:				getAMDGPUs				12.5%
opentela/internal/platform/gpu.go:117:				csvField				100.0%
opentela/internal/platform/slurm/env.go:10:			IsSlurm					100.0%
opentela/internal/platform/slurm/env.go:14:			getJobId				100.0%
opentela/internal/platform/slurm/env.go:18:			getNodeId				100.0%
opentela/internal/platform/slurm/env.go:22:			getRemainingTimeInSeconds		44.4%
opentela/internal/platform/slurm/env.go:43:			GetJobInfo				100.0%
opentela/internal/protocol/bootstrap.go:17:			getDefaultBootstrapPeers		77.8%
opentela/internal/protocol/bootstrap.go:49:			collectBootstrapSources			100.0%
opentela/internal/protocol/bootstrap.go:89:			resolveBootstrapSources			90.0%
opentela/internal/protocol/bootstrap.go:106:			resolveBootstrapSource			85.7%
opentela/internal/protocol/bootstrap.go:122:			fetchHTTPBootstraps			80.0%
opentela/internal/protocol/bootstrap.go:138:			fetchDNSAddrBootstraps			77.8%
opentela/internal/protocol/bootstrap.go:165:			expandBootstrapValue			54.5%
opentela/internal/protocol/bootstrap.go:185:			splitBootstrapValue			100.0%
opentela/internal/protocol/bootstrap.go:192:			parseBootstrapMultiaddrs		75.0%
opentela/internal/protocol/clock.go:21:				StartTicker				0.0%
opentela/internal/protocol/crdt.go:35:				GetCRDTStore				0.0%
opentela/internal/protocol/crdt.go:215:				Reconnect				0.0%
opentela/internal/protocol/crdt.go:233:				TriggerResync				0.0%
opentela/internal/protocol/crdt.go:240:				ClearCRDTStore				0.0%
opentela/internal/protocol/deploykey.go:15:			DeployKeyPath				0.0%
opentela/internal/protocol/deploykey.go:29:			StoreDeployKey				0.0%
opentela/internal/protocol/deploykey.go:43:			LoadDeployKey				0.0%
opentela/internal/protocol/go-ds-crdt/autoban.go:52:		newAutoBan				100.0%
opentela/internal/protocol/go-ds-crdt/autoban.go:65:		bannedKey				100.0%
opentela/internal/protocol/go-ds-crdt/autoban.go:70:		loadFromStore				60.0%
opentela/internal/protocol/go-ds-crdt/autoban.go:94:		isBanned				100.0%
opentela/internal/protocol/go-ds-crdt/autoban.go:107:		recordFailure				84.6%
opentela/internal/protocol/go-ds-crdt/autoban.go:148:		clearFailure				100.0%
opentela/internal/protocol/go-ds-crdt/compaction.go:16:		decodeTombstoneTimestamp		0.0%
opentela/internal/protocol/go-ds-crdt/compaction.go:32:		CompactTombstones			0.0%
opentela/internal/protocol/go-ds-crdt/crdt.go:123:		verify					52.6%
opentela/internal/protocol/go-ds-crdt/crdt.go:164:		DefaultOptions				100.0%
opentela/internal/protocol/go-ds-crdt/crdt.go:257:		New					69.3%
opentela/internal/protocol/go-ds-crdt/crdt.go:403:		handleNext				79.2%
opentela/internal/protocol/go-ds-crdt/crdt.go:518:		decodeBroadcast				61.1%
opentela/internal/protocol/go-ds-crdt/crdt.go:549:		encodeBroadcast				100.0%
opentela/internal/protocol/go-ds-crdt/crdt.go:558:		randomizeInterval			100.0%
opentela/internal/protocol/go-ds-crdt/crdt.go:567:		rebroadcast				87.5%
opentela/internal/protocol/go-ds-crdt/crdt.go:584:		repair					60.0%
opentela/internal/protocol/go-ds-crdt/crdt.go:613:		RebroadcastHeads			0.0%
opentela/internal/protocol/go-ds-crdt/crdt.go:629:		rebroadcastHeads			80.0%
opentela/internal/protocol/go-ds-crdt/crdt.go:666:		logStats				55.6%
opentela/internal/protocol/go-ds-crdt/crdt.go:692:		handleBlock				90.0%
opentela/internal/protocol/go-ds-crdt/crdt.go:715:		handleBranch				88.9%
opentela/internal/protocol/go-ds-crdt/crdt.go:733:		dagWorker				52.9%
opentela/internal/protocol/go-ds-crdt/crdt.go:773:		sendNewJobs				76.3%
opentela/internal/protocol/go-ds-crdt/crdt.go:858:		sendJobWorker				85.7%
opentela/internal/protocol/go-ds-crdt/crdt.go:874:		processedBlockKey			100.0%
opentela/internal/protocol/go-ds-crdt/crdt.go:878:		isProcessed				100.0%
opentela/internal/protocol/go-ds-crdt/crdt.go:882:		markProcessed				100.0%
opentela/internal/protocol/go-ds-crdt/crdt.go:886:		dirtyKey				100.0%
opentela/internal/protocol/go-ds-crdt/crdt.go:891:		MarkDirty				0.0%
opentela/internal/protocol/go-ds-crdt/crdt.go:900:		IsDirty					75.0%
opentela/internal/protocol/go-ds-crdt/crdt.go:909:		MarkClean				0.0%
opentela/internal/protocol/go-ds-crdt/crdt.go:919:		processNode				75.0%
opentela/internal/protocol/go-ds-crdt/crdt.go:1042:		repairDAG				0.0%
opentela/internal/protocol/go-ds-crdt/crdt.go:1163:		Repair					0.0%
opentela/internal/protocol/go-ds-crdt/crdt.go:1169:		Get					0.0%
opentela/internal/protocol/go-ds-crdt/crdt.go:1177:		Has					100.0%
opentela/internal/protocol/go-ds-crdt/crdt.go:1184:		GetSize					0.0%
opentela/internal/protocol/go-ds-crdt/crdt.go:1199:		Query					0.0%
opentela/internal/protocol/go-ds-crdt/crdt.go:1208:		Put					100.0%
opentela/internal/protocol/go-ds-crdt/crdt.go:1214:		Delete					0.0%
opentela/internal/protocol/go-ds-crdt/crdt.go:1228:		Sync					0.0%
opentela/internal/protocol/go-ds-crdt/crdt.go:1272:		Context					0.0%
opentela/internal/protocol/go-ds-crdt/crdt.go:1277:		Close					80.0%
opentela/internal/protocol/go-ds-crdt/crdt.go:1289:		Batch					0.0%
opentela/internal/protocol/go-ds-crdt/crdt.go:1293:		deltaMerge				0.0%
opentela/internal/protocol/go-ds-crdt/crdt.go:1306:		addToDelta				0.0%
opentela/internal/protocol/go-ds-crdt/crdt.go:1312:		rmvToDelta				0.0%
opentela/internal/protocol/go-ds-crdt/crdt.go:1323:		updateDeltaWithRemove			0.0%
opentela/internal/protocol/go-ds-crdt/crdt.go:1345:		updateDelta				0.0%
opentela/internal/protocol/go-ds-crdt/crdt.go:1356:		publishDelta				0.0%
opentela/internal/protocol/go-ds-crdt/crdt.go:1367:		putBlock				81.8%
opentela/internal/protocol/go-ds-crdt/crdt.go:1386:		publish					66.7%
opentela/internal/protocol/go-ds-crdt/crdt.go:1398:		addDAGNode				68.8%
opentela/internal/protocol/go-ds-crdt/crdt.go:1440:		broadcast				71.4%
opentela/internal/protocol/go-ds-crdt/crdt.go:1474:		Put					0.0%
opentela/internal/protocol/go-ds-crdt/crdt.go:1486:		Delete					0.0%
opentela/internal/protocol/go-ds-crdt/crdt.go:1500:		Commit					0.0%
opentela/internal/protocol/go-ds-crdt/crdt.go:1506:		PrintDAG				0.0%
opentela/internal/protocol/go-ds-crdt/crdt.go:1525:		printDAGRec				0.0%
opentela/internal/protocol/go-ds-crdt/crdt.go:1586:		DotDAG					0.0%
opentela/internal/protocol/go-ds-crdt/crdt.go:1614:		dotDAGRec				0.0%
opentela/internal/protocol/go-ds-crdt/crdt.go:1667:		InternalStats				0.0%
opentela/internal/protocol/go-ds-crdt/crdt.go:1682:		newCidSafeSet				100.0%
opentela/internal/protocol/go-ds-crdt/crdt.go:1688:		Visit					100.0%
opentela/internal/protocol/go-ds-crdt/crdt.go:1701:		Remove					100.0%
opentela/internal/protocol/go-ds-crdt/crdt.go:1709:		Has					0.0%
opentela/internal/protocol/go-ds-crdt/heads.go:29:		newHeads				75.0%
opentela/internal/protocol/go-ds-crdt/heads.go:42:		key					100.0%
opentela/internal/protocol/go-ds-crdt/heads.go:47:		write					80.0%
opentela/internal/protocol/go-ds-crdt/heads.go:56:		delete					75.0%
opentela/internal/protocol/go-ds-crdt/heads.go:68:		IsHead					100.0%
opentela/internal/protocol/go-ds-crdt/heads.go:79:		Len					100.0%
opentela/internal/protocol/go-ds-crdt/heads.go:90:		Replace					77.8%
opentela/internal/protocol/go-ds-crdt/heads.go:134:		Add					87.5%
opentela/internal/protocol/go-ds-crdt/heads.go:149:		List					80.0%
opentela/internal/protocol/go-ds-crdt/heads.go:176:		primeCache				35.3%
opentela/internal/protocol/go-ds-crdt/ipld.go:23:		GetDelta				100.0%
opentela/internal/protocol/go-ds-crdt/ipld.go:33:		GetPriority				100.0%
opentela/internal/protocol/go-ds-crdt/ipld.go:48:		GetDeltas				71.4%
opentela/internal/protocol/go-ds-crdt/ipld.go:72:		extractDelta				83.3%
opentela/internal/protocol/go-ds-crdt/ipld.go:82:		makeNode				78.6%
opentela/internal/protocol/go-ds-crdt/migrations.go:18:		versionKey				100.0%
opentela/internal/protocol/go-ds-crdt/migrations.go:22:		getVersion				50.0%
opentela/internal/protocol/go-ds-crdt/migrations.go:39:		setVersion				83.3%
opentela/internal/protocol/go-ds-crdt/migrations.go:50:		applyMigrations				71.4%
opentela/internal/protocol/go-ds-crdt/migrations.go:81:		migrate0to1				46.7%
opentela/internal/protocol/go-ds-crdt/pubsub_broadcaster.go:28:	NewPubSubBroadcaster			0.0%
opentela/internal/protocol/go-ds-crdt/pubsub_broadcaster.go:60:	Broadcast				0.0%
opentela/internal/protocol/go-ds-crdt/pubsub_broadcaster.go:65:	Next					0.0%
opentela/internal/protocol/go-ds-crdt/set.go:50:		newCRDTSet				100.0%
opentela/internal/protocol/go-ds-crdt/set.go:73:		Add					100.0%
opentela/internal/protocol/go-ds-crdt/set.go:86:		Rmv					0.0%
opentela/internal/protocol/go-ds-crdt/set.go:133:		Element					0.0%
opentela/internal/protocol/go-ds-crdt/set.go:150:		Elements				0.0%
opentela/internal/protocol/go-ds-crdt/set.go:251:		InSet					100.0%
opentela/internal/protocol/go-ds-crdt/set.go:259:		keyPrefix				100.0%
opentela/internal/protocol/go-ds-crdt/set.go:264:		elemsPrefix				100.0%
opentela/internal/protocol/go-ds-crdt/set.go:269:		tombsPrefix				100.0%
opentela/internal/protocol/go-ds-crdt/set.go:274:		valueKey				100.0%
opentela/internal/protocol/go-ds-crdt/set.go:279:		priorityKey				100.0%
opentela/internal/protocol/go-ds-crdt/set.go:283:		getPriority				80.0%
opentela/internal/protocol/go-ds-crdt/set.go:300:		setPriority				83.3%
opentela/internal/protocol/go-ds-crdt/set.go:313:		setValue				76.2%
opentela/internal/protocol/go-ds-crdt/set.go:359:		findBestValue				0.0%
opentela/internal/protocol/go-ds-crdt/set.go:464:		putElems				80.8%
opentela/internal/protocol/go-ds-crdt/set.go:510:		putTombs				5.0%
opentela/internal/protocol/go-ds-crdt/set.go:584:		Merge					75.0%
opentela/internal/protocol/go-ds-crdt/set.go:599:		inTombsKeyID				100.0%
opentela/internal/protocol/go-ds-crdt/set.go:620:		datastoreSync				0.0%
opentela/internal/protocol/host.go:65:				GetP2PNode				0.0%
opentela/internal/protocol/host.go:90:				registerPingProtocol			100.0%
opentela/internal/protocol/host.go:94:				newHost					0.0%
opentela/internal/protocol/host.go:363:				StartAutoReconnect			0.0%
opentela/internal/protocol/host.go:371:				startAutoReconnect			0.0%
opentela/internal/protocol/host.go:424:				tryReconnectToBootstraps		0.0%
opentela/internal/protocol/host.go:480:				waitFor					100.0%
opentela/internal/protocol/host.go:496:				backoffDelay				77.8%
opentela/internal/protocol/host.go:512:				backoffBaseDelay			90.0%
opentela/internal/protocol/host.go:532:				isTransientNetworkError			87.5%
opentela/internal/protocol/host.go:549:				bigWindowYamuxMuxer			0.0%
opentela/internal/protocol/host.go:559:				relayServiceResources			0.0%
opentela/internal/protocol/host.go:568:				newResourceManager			0.0%
opentela/internal/protocol/host.go:582:				newDHT					0.0%
opentela/internal/protocol/host.go:596:				ConnectedPeers				0.0%
opentela/internal/protocol/host.go:611:				AllPeers				0.0%
opentela/internal/protocol/host.go:625:				BuildBootstrapAddr			85.7%
opentela/internal/protocol/host.go:637:				buildPublicTCPMultiaddr			66.7%
opentela/internal/protocol/host.go:650:				publicAddrHostAndProtocol		78.6%
opentela/internal/protocol/host.go:676:				appendUniqueMultiaddrs			88.2%
opentela/internal/protocol/host.go:708:				isRecentRelayPeer			100.0%
opentela/internal/protocol/host.go:717:				ConnectedBootstraps			0.0%
opentela/internal/protocol/host.go:757:				MakeRelayReservations			0.0%
opentela/internal/protocol/host.go:796:				TryHolePunch				0.0%
opentela/internal/protocol/host.go:810:				ConnectednessOf				0.0%
opentela/internal/protocol/host.go:824:				IsDirectlyConnected			0.0%
opentela/internal/protocol/host.go:836:				IsTrustedDirectConn			100.0%
opentela/internal/protocol/host.go:848:				HasTrustedDirectConnection		0.0%
opentela/internal/protocol/host.go:869:				FindRelayFor				0.0%
opentela/internal/protocol/host.go:906:				GetResourceManagerStats			0.0%
opentela/internal/protocol/key.go:16:				ResolveKeyPath				83.3%
opentela/internal/protocol/key.go:30:				WriteKeyToFile				0.0%
opentela/internal/protocol/key.go:59:				LoadKeyFromFile				0.0%
opentela/internal/protocol/key.go:86:				GenerateAndWriteKey			0.0%
opentela/internal/protocol/liveness.go:48:			String					0.0%
opentela/internal/protocol/liveness.go:73:			classifyProbeError			100.0%
opentela/internal/protocol/liveness.go:99:			ProbePeerLiveness			0.0%
opentela/internal/protocol/liveness.go:193:			selfRelayVerdict			100.0%
opentela/internal/protocol/liveness.go:203:			relayDialAddr				0.0%
opentela/internal/protocol/liveness.go:237:			probeUnreachableServicePeers		0.0%
opentela/internal/protocol/liveness.go:317:			publishEviction				0.0%
opentela/internal/protocol/liveness.go:353:			mayPublishEviction			100.0%
opentela/internal/protocol/liveness.go:367:			livenessEnforced			0.0%
opentela/internal/protocol/node_table.go:36:			InitScalableNodeTable			0.0%
opentela/internal/protocol/node_table.go:44:			GetScalableSnapshot			0.0%
opentela/internal/protocol/node_table.go:51:			GetNodeTableWriter			0.0%
opentela/internal/protocol/node_table.go:57:			StartSWIM				0.0%
opentela/internal/protocol/node_table.go:228:			parseLabels				0.0%
opentela/internal/protocol/node_table.go:260:			getNodeTable				100.0%
opentela/internal/protocol/node_table.go:267:			UpdateNodeTable				0.0%
opentela/internal/protocol/node_table.go:303:			MarkSelfAsBootstrap			0.0%
opentela/internal/protocol/node_table.go:330:			AnnounceLeave				0.0%
opentela/internal/protocol/node_table.go:358:			UpdateNodeTableHook			71.4%
opentela/internal/protocol/node_table.go:474:			DeleteNodeTableHook			100.0%
opentela/internal/protocol/node_table.go:492:			DeletePeerRow				75.0%
opentela/internal/protocol/node_table.go:519:			GetPeerFromTable			100.0%
opentela/internal/protocol/node_table.go:530:			GetConnectedPeers			0.0%
opentela/internal/protocol/node_table.go:542:			GetAllPeers				100.0%
opentela/internal/protocol/node_table.go:552:			GetService				0.0%
opentela/internal/protocol/node_table.go:573:			LocalServiceNameCounts			0.0%
opentela/internal/protocol/node_table.go:577:			LocalServicesByName			0.0%
opentela/internal/protocol/node_table.go:588:			GetAllProviders				0.0%
opentela/internal/protocol/node_table.go:616:			InitializeMyself			0.0%
opentela/internal/protocol/node_table.go:712:			GetSelf					100.0%
opentela/internal/protocol/node_table.go:719:			SetMyselfRelayPeer			0.0%
opentela/internal/protocol/node_table.go:727:			SetMyselfForTest			100.0%
opentela/internal/protocol/node_table.go:735:			RegisterRemotePeer			0.0%
opentela/internal/protocol/node_table.go:749:			runtimeCapabilities			0.0%
opentela/internal/protocol/node_table.go:753:			serviceNameCounts			0.0%
opentela/internal/protocol/node_table.go:764:			applyLocalRuntimeMetadata		0.0%
opentela/internal/protocol/node_table.go:775:			isKnownHeadPeer				100.0%
opentela/internal/protocol/nodetable/snapshot.go:55:		NewNodeTable				100.0%
opentela/internal/protocol/nodetable/snapshot.go:62:		Snapshot				100.0%
opentela/internal/protocol/nodetable/snapshot.go:67:		Store					100.0%
opentela/internal/protocol/nodetable/snapshot.go:72:		NewSnapshot				100.0%
opentela/internal/protocol/nodetable/snapshot.go:84:		Clone					100.0%
opentela/internal/protocol/nodetable/snapshot.go:100:		ApplyEvent				71.7%
opentela/internal/protocol/nodetable/snapshot.go:187:		RebuildIndexes				91.7%
opentela/internal/protocol/nodetable/writer.go:33:		init					100.0%
opentela/internal/protocol/nodetable/writer.go:52:		NewWriter				100.0%
opentela/internal/protocol/nodetable/writer.go:60:		Start					100.0%
opentela/internal/protocol/nodetable/writer.go:65:		Stop					100.0%
opentela/internal/protocol/nodetable/writer.go:71:		Send					100.0%
opentela/internal/protocol/nodetable/writer.go:79:		run					100.0%
opentela/internal/protocol/nodetable/writer.go:109:		drainAndApply				66.7%
opentela/internal/protocol/nodetable/writer.go:123:		applyBatch				100.0%
opentela/internal/protocol/registrar.go:26:			addLocalService				100.0%
opentela/internal/protocol/registrar.go:55:			snapshotLocalServices			100.0%
opentela/internal/protocol/registrar.go:65:			hasLocalServices			0.0%
opentela/internal/protocol/registrar.go:71:			RegisterLocalServices			0.0%
opentela/internal/protocol/registrar.go:113:			RegisterAdHocService			0.0%
opentela/internal/protocol/registrar.go:124:			normalizeHealthPath			100.0%
opentela/internal/protocol/registrar.go:135:			healthCheckRemote			62.5%
opentela/internal/protocol/registrar.go:160:			registerLLMService			0.0%
opentela/internal/protocol/registrar.go:205:			provideService				0.0%
opentela/internal/protocol/registrar.go:231:			ResetLocalServicesForTest		0.0%
opentela/internal/protocol/registrar.go:238:			SetLocalServicesForTest			0.0%
opentela/internal/protocol/registrar.go:247:			ReannounceLocalServices			0.0%
opentela/internal/protocol/service_health.go:29:		String					0.0%
opentela/internal/protocol/service_health.go:50:		observe					100.0%
opentela/internal/protocol/service_health.go:70:		serviceKey				100.0%
opentela/internal/protocol/service_health.go:81:		mergeAdvertisedServices			94.1%
opentela/internal/protocol/service_health.go:114:		snapshotWithdrawnServices		0.0%
opentela/internal/protocol/service_health.go:124:		setServiceWithdrawn			0.0%
opentela/internal/protocol/service_health.go:134:		serviceHealthInterval			0.0%
opentela/internal/protocol/service_health.go:141:		serviceHealthFailureThreshold		0.0%
opentela/internal/protocol/service_health.go:156:		StartServiceHealthRevalidation		0.0%
opentela/internal/protocol/service_health.go:203:		removeLocalService			0.0%
opentela/internal/protocol/sweep.go:32:				String					0.0%
opentela/internal/protocol/sweep.go:55:				decideSweepAction			94.4%
opentela/internal/protocol/swim/dissemination.go:23:		NewDisseminator				66.7%
opentela/internal/protocol/swim/dissemination.go:35:		UpdateN					100.0%
opentela/internal/protocol/swim/dissemination.go:44:		retransmitLimit				100.0%
opentela/internal/protocol/swim/dissemination.go:50:		Enqueue					88.9%
opentela/internal/protocol/swim/dissemination.go:73:		GetPiggyback				93.3%
opentela/internal/protocol/swim/dissemination.go:100:		statusPriority				50.0%
opentela/internal/protocol/swim/messages.go:58:			MarshalJSON				100.0%
opentela/internal/protocol/swim/messages.go:67:			UnmarshalJSON				87.5%
opentela/internal/protocol/swim/messages.go:87:			Marshal					28.6%
opentela/internal/protocol/swim/messages.go:109:		Unmarshal				100.0%
opentela/internal/protocol/swim/messages.go:129:		Marshal					80.0%
opentela/internal/protocol/swim/messages.go:149:		Unmarshal				76.9%
opentela/internal/protocol/swim/metrics.go:30:			init					100.0%
opentela/internal/protocol/swim/swim.go:72:			NewSWIM					100.0%
opentela/internal/protocol/swim/swim.go:86:			AddMember				100.0%
opentela/internal/protocol/swim/swim.go:97:			RemoveMember				100.0%
opentela/internal/protocol/swim/swim.go:107:			GetStatus				100.0%
opentela/internal/protocol/swim/swim.go:117:			GetIncarnation				100.0%
opentela/internal/protocol/swim/swim.go:124:			Members					100.0%
opentela/internal/protocol/swim/swim.go:136:			probeOnce				86.7%
opentela/internal/protocol/swim/swim.go:168:			processPendingProbes			94.2%
opentela/internal/protocol/swim/swim.go:273:			processSuspects				100.0%
opentela/internal/protocol/swim/swim.go:314:			HandleMessage				100.0%
opentela/internal/protocol/swim/swim.go:366:			processEvents				27.8%
opentela/internal/protocol/swim/swim.go:437:			Run					100.0%
opentela/internal/protocol/swim/swim.go:460:			updateMemberGauge			100.0%
opentela/internal/protocol/swim/swim.go:475:			Close					75.0%
opentela/internal/protocol/swim/transport.go:27:		NewLibP2PTransport			0.0%
opentela/internal/protocol/swim/transport.go:31:		send					0.0%
opentela/internal/protocol/swim/transport.go:49:		SendPing				0.0%
opentela/internal/protocol/swim/transport.go:53:		SendAck					0.0%
opentela/internal/protocol/swim/transport.go:57:		SendPingReq				0.0%
opentela/internal/protocol/swim/transport.go:62:		RegisterHandler				0.0%
opentela/internal/protocol/tombstone_compactor.go:21:		startTombstoneCompactor			0.0%
opentela/internal/protocol/tombstone_compactor.go:91:		readDurationSetting			100.0%
opentela/internal/protocol/tombstone_manager.go:24:		GetTombstoneManager			0.0%
opentela/internal/protocol/tombstone_manager.go:37:		CleanupLeftNodes			87.5%
opentela/internal/protocol/tombstone_manager.go:58:		collectCandidates			100.0%
opentela/internal/server/access_control.go:27:			resolveCallerWallet			46.2%
opentela/internal/server/access_control.go:51:			accessControlMiddleware			81.1%
opentela/internal/server/access_control.go:193:			maybeWorkerScopeFromContext		90.9%
opentela/internal/server/access_control.go:210:			statusForScopeDenial			50.0%
opentela/internal/server/access_control.go:228:			messageForScopeDenial			27.3%
opentela/internal/server/access_control.go:258:			isLibp2pRemoteAddr			100.0%
opentela/internal/server/access_control.go:264:			containsWallet				100.0%
opentela/internal/server/admin.go:30:				validateAdminRegisterReq		100.0%
opentela/internal/server/admin.go:40:				adminRegisterHandler			77.8%
opentela/internal/server/admin.go:56:				adminResyncHandler			0.0%
opentela/internal/server/admin.go:68:				StartAdminServer			0.0%
opentela/internal/server/affinity.go:50:			NewAffinityStore			100.0%
opentela/internal/server/affinity.go:60:			Get					100.0%
opentela/internal/server/affinity.go:85:			Put					100.0%
opentela/internal/server/affinity.go:96:			Size					85.7%
opentela/internal/server/affinity.go:113:			sanitizeAffinityKey			92.9%
opentela/internal/server/affinity.go:139:			selectAffinityPeer			100.0%
opentela/internal/server/analytics_hook.go:22:			getAnalytics				100.0%
opentela/internal/server/analytics_hook.go:26:			initAnalytics				0.0%
opentela/internal/server/analytics_hook.go:56:			stopAnalytics				0.0%
opentela/internal/server/analytics_hook.go:61:			buildProxySample			73.7%
opentela/internal/server/analytics_hook.go:100:			stageDuration				50.0%
opentela/internal/server/auth_client.go:118:			allows					100.0%
opentela/internal/server/auth_client.go:122:			allows					75.0%
opentela/internal/server/auth_client.go:130:			reason					83.3%
opentela/internal/server/auth_client.go:146:			Error					0.0%
opentela/internal/server/auth_client.go:153:			clientMessage				57.1%
opentela/internal/server/auth_client.go:208:			get					100.0%
opentela/internal/server/auth_client.go:218:			set					100.0%
opentela/internal/server/auth_client.go:227:			getFresh				100.0%
opentela/internal/server/auth_client.go:238:			getStale				100.0%
opentela/internal/server/auth_client.go:249:			set					100.0%
opentela/internal/server/auth_client.go:264:			getFresh				100.0%
opentela/internal/server/auth_client.go:275:			getStale				0.0%
opentela/internal/server/auth_client.go:286:			set					100.0%
opentela/internal/server/auth_client.go:301:			isControlPlaneEnabled			100.0%
opentela/internal/server/auth_client.go:305:			controlPlaneTimeout			66.7%
opentela/internal/server/auth_client.go:312:			controlPlaneCacheTTL			100.0%
opentela/internal/server/auth_client.go:319:			controlPlaneStaleIfError		100.0%
opentela/internal/server/auth_client.go:326:			parseBearerToken			77.8%
opentela/internal/server/auth_client.go:341:			uniquePeerIDs				90.9%
opentela/internal/server/auth_client.go:358:			cacheKeyForDecision			100.0%
opentela/internal/server/auth_client.go:364:			cacheKeyForDecisionV2			100.0%
opentela/internal/server/auth_client.go:378:			sha256Hex				100.0%
opentela/internal/server/auth_client.go:383:			controlPlaneFreshTTL			85.7%
opentela/internal/server/auth_client.go:395:			decodeStrictJSON			60.0%
opentela/internal/server/auth_client.go:411:			allowedPeerSet				100.0%
opentela/internal/server/auth_client.go:419:			validateACLResponse			76.0%
opentela/internal/server/auth_client.go:465:			isKnownACLReason			100.0%
opentela/internal/server/auth_client.go:475:			isKnownACLReasonV2			100.0%
opentela/internal/server/auth_client.go:496:			validateACLResponseV2			61.9%
opentela/internal/server/auth_client.go:541:			shouldCacheDecisionV2			100.0%
opentela/internal/server/auth_client.go:545:			evaluateBearerForPeers			82.7%
opentela/internal/server/auth_client.go:654:			evaluateBearerForScope			100.0%
opentela/internal/server/auth_client.go:661:			evaluateKeyHashForScope			57.1%
opentela/internal/server/auth_client.go:773:			authorizeRequestForPeers		66.7%
opentela/internal/server/auth_client.go:784:			authorizeRequestForScope		66.7%
opentela/internal/server/auth_client.go:801:			authorizeKeyHashForScope		66.7%
opentela/internal/server/auth_client.go:815:			verifyBearerToken			84.6%
opentela/internal/server/auth_client.go:861:			resolveClientWallet			75.0%
opentela/internal/server/cors.go:10:				corsHeader				100.0%
opentela/internal/server/cors.go:26:				rewriteHeader				100.0%
opentela/internal/server/crdt_handler.go:13:			listPeers				100.0%
opentela/internal/server/crdt_handler.go:18:			listPeersWithStatus			100.0%
opentela/internal/server/crdt_handler.go:24:			listBootstraps				0.0%
opentela/internal/server/crdt_handler.go:29:			getResourceStats			100.0%
opentela/internal/server/crdt_handler.go:46:			updateLocal				0.0%
opentela/internal/server/crdt_handler.go:64:			deleteLocal				80.0%
opentela/internal/server/crdt_handler.go:96:			getDNT					0.0%
opentela/internal/server/health.go:9:				healthStatusCheck			100.0%
opentela/internal/server/ingest.go:38:				getIngestStats				88.9%
opentela/internal/server/libp2p_http_transport.go:42:		newLibp2pHTTPRoundTripper		100.0%
opentela/internal/server/libp2p_http_transport.go:46:		newTrustedLibp2pHTTPRoundTripper	0.0%
opentela/internal/server/libp2p_http_transport.go:53:		newLibp2pHTTPRoundTripperWithMode	15.0%
opentela/internal/server/libp2p_http_transport.go:100:		RoundTrip				0.0%
opentela/internal/server/libp2p_http_transport.go:117:		CloseIdleConnections			0.0%
opentela/internal/server/loadbalancer.go:33:			Pick					100.0%
opentela/internal/server/loadbalancer.go:34:			OnRequestStart				0.0%
opentela/internal/server/loadbalancer.go:35:			OnRequestEnd				0.0%
opentela/internal/server/loadbalancer.go:43:			Pick					100.0%
opentela/internal/server/loadbalancer.go:47:			OnRequestStart				0.0%
opentela/internal/server/loadbalancer.go:48:			OnRequestEnd				0.0%
opentela/internal/server/loadbalancer.go:62:			newShortestQueueLB			100.0%
opentela/internal/server/loadbalancer.go:72:			resetLoop				55.6%
opentela/internal/server/loadbalancer.go:89:			Pick					100.0%
opentela/internal/server/loadbalancer.go:105:			OnRequestStart				100.0%
opentela/internal/server/loadbalancer.go:111:			OnRequestEnd				100.0%
opentela/internal/server/loadbalancer.go:126:			SetLoadBalancerPolicy			100.0%
opentela/internal/server/loadbalancer.go:138:			GetLoadBalancer				100.0%
opentela/internal/server/node_credentials.go:63:		resetNodeCredentialManagerForTest	100.0%
opentela/internal/server/node_credentials.go:69:		getTrustedNodeCredential		100.0%
opentela/internal/server/node_credentials.go:73:		get					80.0%
opentela/internal/server/node_credentials.go:93:		issueTrustedNodeCredential		71.4%
opentela/internal/server/node_credentials.go:142:		requestAndSignNodeCredentialChallenge	70.6%
opentela/internal/server/node_credentials.go:196:		ioLimit					100.0%
opentela/internal/server/node_credentials.go:200:		nodeCredentialResponseOK		100.0%
opentela/internal/server/p2p_listener.go:11:			P2PListener				0.0%
opentela/internal/server/probe_handler.go:24:			echoHandler				91.7%
opentela/internal/server/probe_handler.go:59:			Read					100.0%
opentela/internal/server/probe_handler.go:101:			holepunchHandler			0.0%
opentela/internal/server/probe_handler.go:149:			runHandler				75.0%
opentela/internal/server/probe_handler.go:195:			runLatency				0.0%
opentela/internal/server/probe_handler.go:229:			summariseDurations			92.3%
opentela/internal/server/probe_handler.go:260:			runThroughput				0.0%
opentela/internal/server/probe_handler.go:326:			runLibp2pPing				0.0%
opentela/internal/server/probe_handler.go:347:			processPingResults			100.0%
opentela/internal/server/proxy_handler.go:68:			init					100.0%
opentela/internal/server/proxy_handler.go:72:			getGlobalTransport			100.0%
opentela/internal/server/proxy_handler.go:89:			getTrustedTransport			0.0%
opentela/internal/server/proxy_handler.go:104:			ErrorHandler				0.0%
opentela/internal/server/proxy_handler.go:117:			WriteHeader				0.0%
opentela/internal/server/proxy_handler.go:127:			Flush					0.0%
opentela/internal/server/proxy_handler.go:134:			P2PForwardHandler			35.3%
opentela/internal/server/proxy_handler.go:194:			P2PServiceForwardHandler		0.0%
opentela/internal/server/proxy_handler.go:203:			TrustedRegionP2PServiceForwardHandler	60.0%
opentela/internal/server/proxy_handler.go:212:			p2pServiceForwardWithScope		47.8%
opentela/internal/server/proxy_handler.go:289:			ServiceForwardHandler			0.0%
opentela/internal/server/proxy_handler.go:352:			parseFallbackLevel			100.0%
opentela/internal/server/proxy_handler.go:371:			selectCandidates			100.0%
opentela/internal/server/proxy_handler.go:446:			weightedRandomSelect			81.2%
opentela/internal/server/proxy_handler.go:476:			scoreCandidates				0.0%
opentela/internal/server/proxy_handler.go:488:			excludePeers				100.0%
opentela/internal/server/proxy_handler.go:502:			shouldShedLoad				100.0%
opentela/internal/server/proxy_handler.go:512:			filterByTrust				0.0%
opentela/internal/server/proxy_handler.go:532:			intersectAllowedPeers			100.0%
opentela/internal/server/proxy_handler.go:559:			priceAwareScores			100.0%
opentela/internal/server/proxy_handler.go:583:			parseAllowedPeerOrder			100.0%
opentela/internal/server/proxy_handler.go:603:			orderCandidatesByPrice			100.0%
opentela/internal/server/proxy_handler.go:623:			filterAllowedCandidatesV2		71.4%
opentela/internal/server/proxy_handler.go:636:			buildInternalServicePath		66.7%
opentela/internal/server/proxy_handler.go:644:			GlobalServiceForwardHandler		60.0%
opentela/internal/server/proxy_handler.go:653:			TrustedRegionServiceForwardHandler	0.0%
opentela/internal/server/proxy_handler.go:662:			globalServiceForwardWithScope		14.9%
opentela/internal/server/ratelimit.go:27:			newRateLimiterStore			100.0%
opentela/internal/server/ratelimit.go:37:			getLimiter				100.0%
opentela/internal/server/ratelimit.go:51:			cleanup					57.1%
opentela/internal/server/ratelimit.go:66:			rateLimitMiddleware			88.9%
opentela/internal/server/registration.go:52:			challengePeer				81.8%
opentela/internal/server/registration.go:77:			registerPeer				37.9%
opentela/internal/server/registration.go:227:			StartChallengeCleanup			0.0%
opentela/internal/server/registration.go:236:			cleanExpiredChallenges			0.0%
opentela/internal/server/retry_writer.go:38:			newRetryableResponseWriter		100.0%
opentela/internal/server/retry_writer.go:54:			Header					100.0%
opentela/internal/server/retry_writer.go:59:			markFailed				100.0%
opentela/internal/server/retry_writer.go:65:			isRetryable				100.0%
opentela/internal/server/retry_writer.go:71:			commitHeaders				87.5%
opentela/internal/server/retry_writer.go:87:			isStreamingResponse			100.0%
opentela/internal/server/retry_writer.go:99:			WriteHeader				87.5%
opentela/internal/server/retry_writer.go:123:			Write					91.7%
opentela/internal/server/retry_writer.go:154:			Flush					100.0%
opentela/internal/server/retry_writer.go:163:			flushToClient				100.0%
opentela/internal/server/retry_writer.go:187:			newFirstByteMarker			0.0%
opentela/internal/server/retry_writer.go:195:			Write					0.0%
opentela/internal/server/retry_writer.go:206:			Flush					0.0%
opentela/internal/server/retry_writer.go:215:			Duration				0.0%
opentela/internal/server/routing_scope.go:36:			trusted					100.0%
opentela/internal/server/routing_scope.go:40:			validate				66.7%
opentela/internal/server/routing_scope.go:56:			newRoutingScope				75.0%
opentela/internal/server/self_handler.go:14:			isLoopback				80.0%
opentela/internal/server/self_handler.go:24:			getSelf					100.0%
opentela/internal/server/self_handler.go:34:			signData				10.7%
opentela/internal/server/server.go:24:				StartServer				0.0%
opentela/internal/server/service_resolution.go:15:		resolveUniqueLocalService		71.4%
opentela/internal/server/service_resolution.go:30:		writeServiceResolutionError		50.0%
opentela/internal/server/timing.go:18:				InitTiming				0.0%
opentela/internal/server/timing.go:36:				newStageTimer				100.0%
opentela/internal/server/timing.go:44:				Mark					100.0%
opentela/internal/server/timing.go:56:				AddRaw					100.0%
opentela/internal/server/timing.go:64:				Header					100.0%
opentela/internal/server/timing.go:78:				mergeWorkerTiming			100.0%
opentela/internal/server/timing.go:95:				parseServerTiming			94.4%
opentela/internal/server/timing.go:125:				setWorkerTimingHeader			100.0%
opentela/internal/server/tracer.go:20:				initTracer				0.0%
opentela/internal/server/tracer.go:44:				IngestEvents				0.0%
opentela/internal/solana/client.go:27:				NewClient				100.0%
opentela/internal/solana/client.go:55:				call					88.2%
opentela/internal/solana/client.go:93:				HasSPLToken				100.0%
opentela/internal/solana/client.go:141:				GetBalance				88.9%
opentela/internal/solana/client.go:159:				GetBalanceSOL				75.0%
opentela/internal/solana/client.go:180:				GetTokenBalance				75.0%
opentela/internal/solana/client.go:191:				GetTokenBalanceDetails			73.3%
opentela/internal/solana/client.go:238:				RequestAirdrop				77.8%
opentela/internal/solana/client.go:276:				SendSOL					0.0%
opentela/internal/solana/client.go:332:				getRecentBlockhash			0.0%
opentela/internal/solana/client.go:359:				buildTransferMessage			100.0%
opentela/internal/solana/client.go:410:				serializeTransaction			100.0%
opentela/internal/usage/extractor.go:15:			ExtractUsageMetrics			93.8%
opentela/internal/usage/store.go:16:				NewUsageStore				83.3%
opentela/internal/usage/store.go:29:				Close					100.0%
opentela/internal/usage/store.go:34:				SaveRecord				83.3%
opentela/internal/usage/store.go:48:				GetRecord				100.0%
opentela/internal/usage/tracker.go:28:				InitTracker				0.0%
opentela/internal/usage/tracker.go:54:				CloseTracker				0.0%
opentela/internal/usage/tracker.go:62:				Track					0.0%
opentela/internal/usage/tracker.go:89:				GenerateRequestID			100.0%
opentela/internal/wallet/identity.go:35:			SignIdentity				75.0%
opentela/internal/wallet/identity.go:67:			VerifyIdentity				77.8%
opentela/internal/wallet/wallet.go:70:				NewWalletManager			66.7%
opentela/internal/wallet/wallet.go:101:				NewWalletManagerWithDir			66.7%
opentela/internal/wallet/wallet.go:119:				loadAccounts				96.2%
opentela/internal/wallet/wallet.go:169:				upgradeLegacyOCFAccount			87.5%
opentela/internal/wallet/wallet.go:205:				normalizeSolanaAccount			87.0%
opentela/internal/wallet/wallet.go:241:				validSolanaPublicKey			100.0%
opentela/internal/wallet/wallet.go:246:				solanaPrivateKeyFromAccount		54.5%
opentela/internal/wallet/wallet.go:281:				ensureManagedSolanaKeypair		58.3%
opentela/internal/wallet/wallet.go:320:				decodePrivateKey			83.3%
opentela/internal/wallet/wallet.go:331:				migrateLegacyWallet			81.8%
opentela/internal/wallet/wallet.go:375:				migrateLegacyDir			82.9%
opentela/internal/wallet/wallet.go:443:				saveAccounts				71.4%
opentela/internal/wallet/wallet.go:464:				Accounts				100.0%
opentela/internal/wallet/wallet.go:472:				DefaultAccount				100.0%
opentela/internal/wallet/wallet.go:486:				SelectAccount				100.0%
opentela/internal/wallet/wallet.go:509:				AddSolanaAccount			73.3%
opentela/internal/wallet/wallet.go:543:				ImportSolanaKeypair			81.8%
opentela/internal/wallet/wallet.go:593:				ExportKeypair				77.8%
opentela/internal/wallet/wallet.go:612:				ExportBase58PrivateKey			85.7%
opentela/internal/wallet/wallet.go:631:				FindByFile				100.0%
opentela/internal/wallet/wallet.go:641:				FindByPublicKey				100.0%
opentela/internal/wallet/wallet.go:651:				FindByProviderID			100.0%
opentela/internal/wallet/wallet.go:661:				WalletExists				100.0%
opentela/internal/wallet/wallet.go:669:				GetPublicKey				100.0%
opentela/internal/wallet/wallet.go:676:				GetPrivateKey				100.0%
opentela/internal/wallet/wallet.go:683:				GetWalletPath				100.0%
opentela/internal/wallet/wallet.go:690:				GetWalletType				100.0%
opentela/internal/wallet/wallet.go:699:				GetProviderID				100.0%
opentela/internal/wallet/wallet.go:708:				GetPrivateKeyBytes			77.8%
opentela/internal/wallet/wallet.go:728:				InitializeWallet			83.3%
opentela/internal/wallet/wallet.go:745:				writeSolanaKeypair			77.8%
opentela/internal/wallet/wallet.go:762:				parseSolanaKeypairJSON			100.0%
opentela/internal/wallet/wallet.go:783:				deriveProviderID			100.0%
opentela/internal/wallet/wallet.go:792:				copyDirRecursive			76.9%
opentela/plugins/webui/embed.go:12:				Static					0.0%
total:								(statements)				50.8%

Summary:

@xzyaoi
xzyaoi merged commit f740781 into main Oct 14, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants