Skip to content

Signal coverage

Every metric and log event tailscale2otel emits is accounted for here. The table says what each signal is for — whether the shipped dashboard charts it, an alert rule watches it, a recording rule folds it, or it is deliberately query-only.

This page is generated from internal/catalog/signal_dispositions.json, a manifest that is itself gated in CI against three things: the in-code telemetry catalog (so a new signal cannot land undecided), the generated dashboard, and the two alert-rule files (so a visualized or alertable claim has to be true, in both directions). Nothing here comes from a text search over prose.

Regenerate with:

go test ./internal/catalog -run TestSignalDispositionsInSync -update
go test ./internal/catalog -run TestSignalCoverageDocInSync -update

Dispositions

dispositionmeaning
visualizedqueried by at least one panel on either generated dashboard
alertablequeried by at least one alert rule expression
recordedconsumed by at least one recording rule expression
drives_a_variablequeried by a dashboard template variable — a presence sentinel, or a filter dropdown

A signal can carry several at once (most alerted metrics are also charted). All four are derived — read off the shipped artifacts by the regenerator — so there is nothing here for anyone to assign by hand, and no value that can be written to settle a signal that is not actually on a surface.

drives_a_variable is deliberately not visualized (#527). A presence sentinel's label_values() call references a metric every bit as really as a panel query does, and puts nothing on screen — so while both fed one value, a signal could satisfy the every-signal-reaches-a-panel bar while being invisible. tailscale.subnet_routes.advertised sat in exactly that state, covered only by the sentinel gating a row, and it stayed invisible until #526 deleted that row. tailscale.key.expiring was worse: it counted as covered because its name appears as an option value in a dropdown, which is not a query at all. Both have panels now.

Every emitted signal must appear on a panel, and #526 removed the last three ways round that. raw_only and omitted were deleted first: "deliberately query-only" is indistinguishable, from the outside, from "nobody got round to it", and 35 signals had accrued under the two of them. pending_panel replaced them as an explicitly transitional, shrink-only ledger — a signal could only ever leave it by gaining a panel — and was itself deleted the moment it emptied, which is the only reason it was safe to introduce.

The only exemptions now are three structural classes, each an individually justified entry in catalog.StructuralExemptions() and none of them a judgement about whether a signal is worth charting:

classwhy it cannot be required
histogram_basethe base name of a histogram is never queried directly — panels query _bucket/_sum/_count
templated_eventthe event name is built at emit time (tailscale.webhook.<type>), so no literal selector can equal it
recorded_onlyconsumed only by a recording rule whose output metric is itself panelled

Operational and self-observability coverage are reported separately. They answer different questions ("can I see my tailnet?" versus "can I see the exporter?"), and a well-covered fleet story would otherwise hide a blind exporter.

The units, descriptions and attribute keys for every signal below are in metrics.md; this page only covers what each one is used for.

Summary

A signal can carry more than one disposition, so the columns do not sum to the total.

surfacesignalsvisualizedalertablerecordeddrives a variable
operational218217571144
self_obs929229910

Operational signals

signalkindqueried asdispositionnote
tailscale.acl.risky_rulelog_eventevent_name="tailscale.acl.risky_rule"visualized#526 wave ⅔: panel scheduled on tailnet/Security & Audit > Risk & ACL.
tailscale.acl.validation_issuelog_eventevent_name="tailscale.acl.validation_issue"visualized
tailscale.config.auditlog_eventevent_name="tailscale.config.audit"visualized, alertable, drives_a_variable
tailscale.device.attribute.expiringlog_eventevent_name="tailscale.device.attribute.expiring"visualized#526 wave ⅔: panel scheduled on tailnet/Security & Audit > Posture & Compliance.
tailscale.device.key_expiringlog_eventevent_name="tailscale.device.key_expiring"visualized#526 wave ⅔: panel scheduled on tailnet/Security & Audit > Identity & Keys.
tailscale.device.posturelog_eventevent_name="tailscale.device.posture"visualized, drives_a_variable
tailscale.device.tailnet_lock_errorlog_eventevent_name="tailscale.device.tailnet_lock_error"visualized
tailscale.device_invitelog_eventevent_name="tailscale.device_invite"visualized#526 wave ⅔: panel scheduled on tailnet/Devices > Inventory & Hygiene.
tailscale.k8s.api_requestlog_eventevent_name="tailscale.k8s.api_request"visualizedThe per-request record carrying the high-cardinality detail kept off the metrics (object name, query-free path, selectors, pod/container, and the raw exec command line under pii_filter.command_text). Read in Loki by event_name; this is the SIEM surface for the feed.
tailscale.k8s.sessionlog_eventevent_name="tailscale.k8s.session"visualizedPer-session record from the .cast header: namespace, pod, container, session type, command and the recorder that holds the recording. Read in Loki by event_name.
tailscale.key.expiringlog_eventevent_name="tailscale.key.expiring"visualized, drives_a_variable
tailscale.key.scopeslog_eventevent_name="tailscale.key.scopes"visualized
tailscale.logstream.errorlog_eventevent_name="tailscale.logstream.error"visualized
tailscale.network.flowlog_eventevent_name="tailscale.network.flow"visualized, drives_a_variable
tailscale.oauth_app.infolog_eventevent_name="tailscale.oauth_app.info"visualized
tailscale.webhook.<type>log_eventevent_name="tailscale.webhook.<type>"UNASSIGNEDThe event name is templated per webhook category, so no literal selector can name it. The dashboard's log-event picker does reach it, with the glob tailscale.webhook.*, which a literal-name gate cannot see.
tailscale.webhook_endpoints.event_mismatchlog_eventevent_name="tailscale.webhook_endpoints.event_mismatch"visualized
tailscale.acl.autoapproversmetrictailscale_acl_autoapprovers_ratiovisualized, alertable
tailscale.acl.last_changedmetrictailscale_acl_last_changed_secondsvisualized
tailscale.acl.posture_gated_rulesmetrictailscale_acl_posture_gated_rules_ratiovisualized
tailscale.acl.rulesmetrictailscale_acl_rules_ratiovisualized
tailscale.acl.sizemetrictailscale_acl_size_bytesvisualized
tailscale.acl.ssh_wildcardmetrictailscale_acl_ssh_wildcard_ratiovisualized
tailscale.acl.unrestricted_rulesmetrictailscale_acl_unrestricted_rules_ratiovisualized, alertable, drives_a_variable
tailscale.acl.validation.errorsmetrictailscale_acl_validation_errors_ratiovisualized
tailscale.acl.validation.okmetrictailscale_acl_validation_ok_ratiovisualized
tailscale.acl.validation.test_failuresmetrictailscale_acl_validation_test_failures_ratiovisualized
tailscale.acl.validation.warningsmetrictailscale_acl_validation_warnings_ratiovisualized
tailscale.acl.wildcard_rulesmetrictailscale_acl_wildcard_rules_ratiovisualized
tailscale.config.audit.changesmetrictailscale_config_audit_changes_totalvisualized, alertable, drives_a_variable
tailscale.config.audit.deferred.delaymetrictailscale_config_audit_deferred_delay_secondsvisualized
tailscale.config.audit.eventsmetrictailscale_config_audit_events_totalvisualized, drives_a_variable
tailscale.config.audit.processing.delaymetrictailscale_config_audit_processing_delay_secondsvisualized
tailscale.config.audit.schema_driftmetrictailscale_config_audit_schema_drift_totalvisualized, alertable
tailscale.contact.needs_verificationmetrictailscale_contact_needs_verification_ratiovisualized, alertable
tailscale.derp.region.devicesmetrictailscale_derp_region_devices_ratiovisualized, drives_a_variable
tailscale.derp.region.latency_minmetrictailscale_derp_region_latency_min_secondsvisualized, alertable
tailscale.derp.region.preferredmetrictailscale_derp_region_preferred_ratiovisualized
tailscale.device.attributemetrictailscale_device_attribute_ratiovisualized, drives_a_variable
tailscale.device.attribute.expirymetrictailscale_device_attribute_expiry_secondsvisualized, alertable#526 wave ⅔: panel scheduled on tailnet/Security & Audit > Posture & Compliance - ALERTABLE-ONLY today.
tailscale.device.attribute.infometrictailscale_device_attribute_info_ratiovisualized
tailscale.device.blocks_incoming_connectionsmetrictailscale_device_blocks_incoming_connections_ratiovisualized, drives_a_variableOne series per device: deliberately query-only, for ad-hoc drill-down onto a named host rather than a default panel that would carry the whole fleet.
tailscale.device.connectivity.direct_capablemetrictailscale_device_connectivity_direct_capable_ratiovisualizedOne series per device, describing that device's NAT/transport situation; deliberately query-only for drill-down onto a host that is stuck on DERP.
tailscale.device.connectivity.endpointsmetrictailscale_device_connectivity_endpoints_ratiovisualizedOne series per device, describing that device's NAT/transport situation; deliberately query-only for drill-down onto a host that is stuck on DERP.
tailscale.device.connectivity.hard_natmetrictailscale_device_connectivity_hard_nat_ratiovisualized, drives_a_variable
tailscale.device.connectivity.ipv6metrictailscale_device_connectivity_ipv6_ratiovisualizedOne series per device, describing that device's NAT/transport situation; deliberately query-only for drill-down onto a host that is stuck on DERP.
tailscale.device.connectivity.udpmetrictailscale_device_connectivity_udp_ratiovisualizedOne series per device, describing that device's NAT/transport situation; deliberately query-only for drill-down onto a host that is stuck on DERP.
tailscale.device.derp.latencymetrictailscale_device_derp_latency_secondsvisualized, drives_a_variable
tailscale.device.distrometrictailscale_device_distro_ratiovisualized#526 wave ⅔: panel scheduled on tailnet/Devices > Inventory & Hygiene.
tailscale.device.exit_nodemetrictailscale_device_exit_node_ratiovisualized, drives_a_variable
tailscale.device.key.expirymetrictailscale_device_key_expiry_secondsvisualized, alertable, recorded
tailscale.device.key_expiry_disabledmetrictailscale_device_key_expiry_disabled_ratiovisualizedOne series per device: deliberately query-only, for ad-hoc drill-down onto a named host rather than a default panel that would carry the whole fleet.
tailscale.device.last_seenmetrictailscale_device_last_seen_secondsvisualized
tailscale.device.multiple_connectionsmetrictailscale_device_multiple_connections_ratiovisualized, alertableOne series per device: deliberately query-only, for ad-hoc drill-down onto a named host rather than a default panel that would carry the whole fleet.
tailscale.device.onlinemetrictailscale_device_online_ratiovisualized, recorded, drives_a_variable
tailscale.device.posturemetrictailscale_device_posture_ratiovisualized, alertable, recorded, drives_a_variable
tailscale.device.posture_identity.disabledmetrictailscale_device_posture_identity_disabled_ratiovisualizedOne series per device: deliberately query-only, for ad-hoc drill-down onto a named host rather than a default panel that would carry the whole fleet.
tailscale.device.routes.advertisedmetrictailscale_device_routes_advertisedvisualized, drives_a_variable
tailscale.device.routes.enabledmetrictailscale_device_routes_enabledvisualized
tailscale.device.ssh_enabledmetrictailscale_device_ssh_enabled_ratiovisualizedOne series per device: deliberately query-only, for ad-hoc drill-down onto a named host rather than a default panel that would carry the whole fleet.
tailscale.device.update_availablemetrictailscale_device_update_available_ratiovisualized, alertable
tailscale.device.version_skewmetrictailscale_device_version_skew_ratiovisualized, alertable
tailscale.device_invites.countmetrictailscale_device_invites_count_ratiovisualized, alertable, drives_a_variable
tailscale.device_invites.pending_agemetrictailscale_device_invites_pending_age_secondsvisualized
tailscale.devices.agemetrictailscale_devices_age_secondsvisualized
tailscale.devices.by_countrymetrictailscale_devices_by_country_ratiovisualized#526 wave ⅔: panel scheduled on tailnet/Devices > Inventory & Hygiene.
tailscale.devices.by_distrometrictailscale_devices_by_distro_ratiovisualized
tailscale.devices.by_tagmetrictailscale_devices_by_tag_ratiovisualized
tailscale.devices.by_versionmetrictailscale_devices_by_version_ratiovisualized
tailscale.devices.client_supportsmetrictailscale_devices_client_supports_ratiovisualized
tailscale.devices.countmetrictailscale_devices_count_ratiovisualized, alertable, recorded
tailscale.devices.direct_capablemetrictailscale_devices_direct_capable_ratiovisualized
tailscale.devices.ephemeralmetrictailscale_devices_ephemeral_ratiovisualized
tailscale.devices.hard_natmetrictailscale_devices_hard_nat_ratiovisualized, alertable, recorded
tailscale.devices.key_expirymetrictailscale_devices_key_expiry_daysvisualized, drives_a_variable
tailscale.devices.key_expiry_disabledmetrictailscale_devices_key_expiry_disabled_ratiovisualized, alertable
tailscale.devices.outdatedmetrictailscale_devices_outdated_ratiovisualized, alertable
tailscale.devices.ssh_enabledmetrictailscale_devices_ssh_enabled_ratiovisualized
tailscale.devices.untaggedmetrictailscale_devices_untagged_ratiovisualized
tailscale.dns.magic_dnsmetrictailscale_dns_magic_dns_ratiovisualized
tailscale.dns.nameservers.countmetrictailscale_dns_nameservers_count_ratiovisualized
tailscale.dns.override_localmetrictailscale_dns_override_local_ratiovisualized
tailscale.dns.resolvermetrictailscale_dns_resolver_ratiovisualized
tailscale.dns.resolvers.use_with_exit_nodemetrictailscale_dns_resolvers_use_with_exit_node_ratiovisualized
tailscale.dns.search_pathmetrictailscale_dns_search_path_ratiovisualized
tailscale.dns.search_paths.countmetrictailscale_dns_search_paths_count_ratiovisualized
tailscale.dns.split_zones.countmetrictailscale_dns_split_zones_count_ratiovisualized
tailscale.exit_node.iometrictailscale_exit_node_io_bytes_totalvisualized, drives_a_variable
tailscale.exit_node.packetsmetrictailscale_exit_node_packets_totalvisualized
tailscale.exit_nodes.countmetrictailscale_exit_nodes_count_ratiovisualized
tailscale.feature.enabledmetrictailscale_feature_enabled_ratiovisualized, alertable
tailscale.fleet.latest_versionmetrictailscale_fleet_latest_version_ratiovisualized
tailscale.geoip.database.build_timemetrictailscale_geoip_database_build_time_secondsvisualized, alertable#526 wave ⅔: panel scheduled on tailnet/Policy & Config > Integrations - ALERTABLE-ONLY today.
tailscale.geoip.downloadsmetrictailscale_geoip_downloads_totalvisualized#526 wave ⅔: panel scheduled on tailnet/Policy & Config > Integrations.
tailscale.geoip.lookupsmetrictailscale_geoip_lookups_totalvisualized#526 wave ⅔: panel scheduled on tailnet/Policy & Config > Integrations.
tailscale.geoip.reloadsmetrictailscale_geoip_reloads_totalvisualized#526 wave ⅔: panel scheduled on tailnet/Policy & Config > Integrations.
tailscale.k8s.api.exec_sessionsmetrictailscale_k8s_api_exec_sessions_totalvisualized, drives_a_variablekubectl exec/attach/port-forward attempts, dimensioned by the bounded command_class. Queried ad hoc in Loki alongside tailscale.k8s.api_request until a dashboard exists.
tailscale.k8s.api.mutationsmetrictailscale_k8s_api_mutations_totalvisualized, drives_a_variablecreate/update/patch/delete attempts. Counts what was REQUESTED, not what succeeded, so it cannot back a change-success panel and no rule uses it.
tailscale.k8s.api.rbac_probesmetrictailscale_k8s_api_rbac_probes_totalvisualized, drives_a_variableSelfSubjectRulesReview/SelfSubjectAccessReview volume, the signature of permission enumeration. Charted by resource and namespace. Deliberately not alerted: it is normal for UI clients such as Freelens, so the interesting pattern is a burst from an unexpected user agent, which needs a cluster-specific baseline.
tailscale.k8s.api.requestsmetrictailscale_k8s_api_requests_totalvisualized, drives_a_variableBaseline Kubernetes API request volume, broken down by verb, namespace, resource and user agent on the Kubernetes Audit tab. Counts ATTEMPTS: the source carries no response status, so this is request volume, never a success or failure rate.
tailscale.k8s.api.sensitive_readsmetrictailscale_k8s_api_sensitive_reads_totalvisualized, drives_a_variableReads of secrets, service accounts and RBAC objects, charted by resource, namespace and user agent. A strong alerting candidate, but deliberately NOT wired to a rule: a useful threshold depends on the cluster's own baseline, and an arbitrary one would page on normal operator traffic.
tailscale.k8s.schema_driftmetrictailscale_k8s_schema_drift_totalvisualized, drives_a_variableGuards an explicitly BETA upstream schema with no version field. Charted as a rate plus a range stat whose thresholds treat any drift as red, since a healthy feed reports nothing at all. Watch it after upgrading the operator or the recorder.
tailscale.k8s.session.startedmetrictailscale_k8s_session_started_totalvisualized, drives_a_variableTerminal sessions derived from .cast headers. Fires once at session start; session completeness is not observable from the bucket, so there is no duration metric to visualize alongside it.
tailscale.key.allowed_tagsmetrictailscale_key_allowed_tags_ratiovisualized
tailscale.key.expirymetrictailscale_key_expiry_secondsvisualized, alertable, drives_a_variable
tailscale.key.preauthorizedmetrictailscale_key_preauthorized_ratiovisualized
tailscale.key.scope_classmetrictailscale_key_scope_class_ratiovisualized, alertable#526 wave ⅔: panel scheduled on tailnet/Security & Audit > Identity & Keys - ALERTABLE-ONLY today.
tailscale.key.scopesmetrictailscale_key_scopes_ratiovisualized, drives_a_variable
tailscale.key.tag_scopemetrictailscale_key_tag_scope_ratiovisualized, alertable#526 wave ⅔: panel scheduled on tailnet/Security & Audit > Identity & Keys - ALERTABLE-ONLY today.
tailscale.keys.agemetrictailscale_keys_age_secondsvisualized
tailscale.keys.by_ownermetrictailscale_keys_by_owner_ratiovisualized
tailscale.keys.countmetrictailscale_keys_count_ratiovisualized
tailscale.logstream.bytes_sentmetrictailscale_logstream_bytes_sent_totalvisualized
tailscale.logstream.configuredmetrictailscale_logstream_configured_ratiovisualized, drives_a_variable
tailscale.logstream.entries_sentmetrictailscale_logstream_entries_sent_totalvisualized
tailscale.logstream.errormetrictailscale_logstream_error_ratiovisualized
tailscale.logstream.last_activitymetrictailscale_logstream_last_activity_secondsvisualized, alertable
tailscale.logstream.max_body_requestsmetrictailscale_logstream_max_body_requests_totalvisualized, alertable
tailscale.logstream.requestsmetrictailscale_logstream_requests_totalvisualized
tailscale.logstream.requests_failedmetrictailscale_logstream_requests_failed_totalvisualized, alertable
tailscale.logstream.spoofed_entriesmetrictailscale_logstream_spoofed_entries_totalvisualized, alertable
tailscale.network.data_qualitymetrictailscale_network_data_quality_totalvisualized
tailscale.network.dedup.conflictsmetrictailscale_network_dedup_conflicts_totalvisualized
tailscale.network.field.observationsmetrictailscale_network_field_observations_totalvisualized
tailscale.network.flow.logs_droppedmetrictailscale_network_flow_logs_dropped_totalvisualized, alertable
tailscale.network.flowsmetrictailscale_network_flows_totalvisualized, alertable, drives_a_variable
tailscale.network.iometrictailscale_network_io_bytes_totalvisualized, recorded, drives_a_variable
tailscale.network.io.rollupmetrictailscale_network_io_rollup_bytes_totalvisualized, recorded, drives_a_variable
tailscale.network.packetsmetrictailscale_network_packets_totalvisualized
tailscale.network.packets.rollupmetrictailscale_network_packets_rollup_totalvisualized
tailscale.network.reporter.observationsmetrictailscale_network_reporter_observations_totalvisualized, alertable
tailscale.network.store.droppedmetrictailscale_network_store_dropped_totalvisualized
tailscale.network.unique.dst_peersmetrictailscale_network_unique_dst_peersvisualized, drives_a_variable
tailscale.network.unique.dst_portsmetrictailscale_network_unique_dst_portsvisualized
tailscale.node.derp.home_regionmetrictailscale_node_derp_home_region_ratiovisualized
tailscale.node.health_messagesmetrictailscale_node_health_messages_ratiovisualized, alertable
tailscale.node.iometrictailscale_node_io_bytes_totalvisualized, drives_a_variable
tailscale.node.packetsmetrictailscale_node_packets_totalvisualizedPacket counterpart of the visualized tailscale.node.io / tailscale.node.peer_relay.io byte counters; kept for ad-hoc PromQL rather than doubling every traffic panel.
tailscale.node.packets.droppedmetrictailscale_node_packets_dropped_totalvisualized, alertable
tailscale.node.peer_relay.endpointsmetrictailscale_node_peer_relay_endpoints_ratiovisualized, alertable
tailscale.node.peer_relay.iometrictailscale_node_peer_relay_io_bytes_totalvisualized
tailscale.node.peer_relay.packetsmetrictailscale_node_peer_relay_packets_totalvisualizedPacket counterpart of the visualized tailscale.node.io / tailscale.node.peer_relay.io byte counters; kept for ad-hoc PromQL rather than doubling every traffic panel.
tailscale.node.upmetrictailscale_node_up_ratiovisualized, alertable, drives_a_variable
tailscale.oauth_app.node_attributesmetrictailscale_oauth_app_node_attributes_ratiovisualized
tailscale.oauth_app.redirect_urismetrictailscale_oauth_app_redirect_uris_ratiovisualized
tailscale.oauth_app.scope_classmetrictailscale_oauth_app_scope_class_ratiovisualized
tailscale.oauth_app.scopesmetrictailscale_oauth_app_scopes_ratiovisualized
tailscale.oauth_apps.agemetrictailscale_oauth_apps_age_secondsvisualized
tailscale.oauth_apps.countmetrictailscale_oauth_apps_count_ratiovisualized
tailscale.posture_integration.errormetrictailscale_posture_integration_error_ratiovisualized, alertable#526 wave ⅔: panel scheduled on tailnet/Policy & Config > Integrations - ALERTABLE-ONLY today.
tailscale.posture_integration.last_syncmetrictailscale_posture_integration_last_sync_secondsvisualized, alertable
tailscale.posture_integration.matchedmetrictailscale_posture_integration_matched_ratiovisualized, alertable
tailscale.posture_integration.possible_matchedmetrictailscale_posture_integration_possible_matched_ratiovisualized, alertable
tailscale.posture_integration.provider_hostsmetrictailscale_posture_integration_provider_hosts_ratiovisualized
tailscale.posture_integrations.countmetrictailscale_posture_integrations_count_ratiovisualized, drives_a_variable
tailscale.rdns.cache.capacitymetrictailscale_rdns_cache_capacity_ratiovisualized
tailscale.rdns.cache.entriesmetrictailscale_rdns_cache_entries_ratiovisualized, drives_a_variable
tailscale.rdns.cache.evictionsmetrictailscale_rdns_cache_evictions_totalvisualized
tailscale.rdns.cache.lookupsmetrictailscale_rdns_cache_lookups_totalvisualized
tailscale.rdns.cache.overflowsmetrictailscale_rdns_cache_overflows_totalvisualized, alertable
tailscale.rdns.queriesmetrictailscale_rdns_queries_totalvisualized
tailscale.rdns.refreshesmetrictailscale_rdns_refreshes_totalvisualized
tailscale.service.hostsmetrictailscale_service_hosts_ratiovisualized, alertable
tailscale.service.portsmetrictailscale_service_portsvisualized, drives_a_variable
tailscale.services.countmetrictailscale_services_count_ratiovisualized, drives_a_variable
tailscale.setting.devices_key_durationmetrictailscale_setting_devices_key_duration_daysvisualized
tailscale.setting.enabledmetrictailscale_setting_enabled_ratiovisualized, alertable
tailscale.setting.users_external_tailnets_rolemetrictailscale_setting_users_external_tailnets_role_ratiovisualized
tailscale.stream.decode_errorsmetrictailscale_stream_decode_errors_totalvisualized
tailscale.stream.inflightmetrictailscale_stream_inflightvisualized
tailscale.stream.recordsmetrictailscale_stream_records_totalvisualized, drives_a_variable
tailscale.stream.rejectedmetrictailscale_stream_rejected_totalvisualized, alertable, recorded
tailscale.stream.request.durationmetrictailscale_stream_request_duration_secondsvisualized, alertable, drives_a_variable
tailscale.stream.skippedmetrictailscale_stream_skipped_totalvisualized, alertable
tailscale.subnet_routes.advertisedmetrictailscale_subnet_routes_advertisedvisualized
tailscale.subnet_routes.enabledmetrictailscale_subnet_routes_enabledvisualized
tailscale.subnet_routes.routersmetrictailscale_subnet_routes_routers_ratiovisualized, alertable
tailscale.subnet_routes.unapprovedmetrictailscale_subnet_routes_unapprovedvisualized, alertable
tailscale.tailnet_lock.errorsmetrictailscale_tailnet_lock_errors_ratiovisualized, alertable, drives_a_variable
tailscale.user.connectedmetrictailscale_user_connected_ratiovisualized, drives_a_variable
tailscale.user.devicesmetrictailscale_user_devices_ratiovisualized
tailscale.user.last_seenmetrictailscale_user_last_seen_secondsvisualized
tailscale.user_invites.countmetrictailscale_user_invites_count_ratiovisualized
tailscale.user_invites.pending_agemetrictailscale_user_invites_pending_age_secondsvisualized, alertable
tailscale.users.agemetrictailscale_users_age_secondsvisualized
tailscale.users.countmetrictailscale_users_count_ratiovisualized
tailscale.webhook.duplicatesmetrictailscale_webhook_duplicates_totalvisualized
tailscale.webhook.eventsmetrictailscale_webhook_events_totalvisualized, alertable, drives_a_variable
tailscale.webhook.inflightmetrictailscale_webhook_inflightvisualized
tailscale.webhook.rejectedmetrictailscale_webhook_rejected_totalvisualized, alertable, recorded
tailscale.webhook.request.durationmetrictailscale_webhook_request_duration_secondsvisualized
tailscale.webhook.schema_driftmetrictailscale_webhook_schema_drift_totalvisualized, alertable
tailscale.webhook_endpoint.agemetrictailscale_webhook_endpoint_age_secondsvisualized
tailscale.webhook_endpoint.subscriptionsmetrictailscale_webhook_endpoint_subscriptions_ratiovisualized
tailscale.webhook_endpoints.countmetrictailscale_webhook_endpoints_count_ratiovisualized
tailscale.webhook_endpoints.desired_unrecognizedmetrictailscale_webhook_endpoints_desired_unrecognized_ratiovisualized
tailscale.webhook_endpoints.event_desired_coveredmetrictailscale_webhook_endpoints_event_desired_covered_ratiovisualized
tailscale.webhook_endpoints.event_subscriptionsmetrictailscale_webhook_endpoints_event_subscriptions_ratiovisualized
tailscale2otel.nodemetrics.discovery.successmetrictailscale2otel_nodemetrics_discovery_success_ratiovisualized, alertable
tailscale2otel.nodemetrics.discovery.targetsmetrictailscale2otel_nodemetrics_discovery_targetsvisualized
tailscale2otel.nodemetrics.metric_names.droppedmetrictailscale2otel_nodemetrics_metric_names_dropped_totalvisualized, alertable
tailscale2otel.objectstore.backlogmetrictailscale2otel_objectstore_backlog_ratiovisualized, alertable, recorded
tailscale2otel.objectstore.bytesmetrictailscale2otel_objectstore_bytes_totalvisualized
tailscale2otel.objectstore.cursor.agemetrictailscale2otel_objectstore_cursor_age_secondsvisualized
tailscale2otel.objectstore.decompressed.bytesmetrictailscale2otel_objectstore_decompressed_bytes_totalvisualized
tailscale2otel.objectstore.discovered.newest.agemetrictailscale2otel_objectstore_discovered_newest_age_secondsvisualized, alertable
tailscale2otel.objectstore.expansion.limit_failuresmetrictailscale2otel_objectstore_expansion_limit_failures_totalvisualized
tailscale2otel.objectstore.gap.healthymetrictailscale2otel_objectstore_gap_healthy_ratiovisualized
tailscale2otel.objectstore.gap.oldest.agemetrictailscale2otel_objectstore_gap_oldest_age_secondsvisualized, alertable
tailscale2otel.objectstore.gapsmetrictailscale2otel_objectstore_gaps_ratiovisualized
tailscale2otel.objectstore.objectsmetrictailscale2otel_objectstore_objects_totalvisualized
tailscale2otel.objectstore.pending.oldest.agemetrictailscale2otel_objectstore_pending_oldest_age_secondsvisualized
tailscale2otel.objectstore.recordsmetrictailscale2otel_objectstore_records_totalvisualized
tailscale2otel.objectstore.request.durationmetrictailscale2otel_objectstore_request_duration_secondsvisualized
tailscale2otel.objectstore.requestsmetrictailscale2otel_objectstore_requests_totalvisualized
tailscale2otel.objectstore.retriesmetrictailscale2otel_objectstore_retries_totalvisualized
tailscale2otel.objectstore.scan.truncatedmetrictailscale2otel_objectstore_scan_truncated_ratiovisualized
tailscale2otel.objectstore.skippedmetrictailscale2otel_objectstore_skipped_totalvisualized, alertable, recorded

Self-observability signals

signalkindqueried asdispositionnote
process.cpu.timemetricprocess_cpu_time_seconds_totalvisualized#526 wave ⅔: panel scheduled on health/Runtime (Go runtime).
process.uptimemetricprocess_uptime_secondsvisualized#526 wave ⅔: panel scheduled on health/Runtime (Go runtime).
tailscale2otel.admin.auth.rejectedmetrictailscale2otel_admin_auth_rejected_totalvisualized, alertable
tailscale2otel.annotation.degradedmetrictailscale2otel_annotation_degraded_ratiovisualized#526 wave ⅔: panel scheduled on health/Delivery (annotations).
tailscale2otel.annotation.droppedmetrictailscale2otel_annotation_dropped_totalvisualized#526 wave ⅔: panel scheduled on health/Delivery (annotations).
tailscale2otel.annotation.publishedmetrictailscale2otel_annotation_published_totalvisualized#526 wave ⅔: panel scheduled on health/Delivery (annotations).
tailscale2otel.api.availabilitymetrictailscale2otel_api_availability_ratiovisualized, alertable
tailscale2otel.api.durationmetrictailscale2otel_api_duration_secondsvisualized, drives_a_variable
tailscale2otel.api.last_probemetrictailscale2otel_api_last_probe_secondsvisualized
tailscale2otel.api.rate_limit.waitmetrictailscale2otel_api_rate_limit_wait_secondsvisualized, alertable
tailscale2otel.api.requestsmetrictailscale2otel_api_requests_totalvisualized, alertable, recorded
tailscale2otel.api.retriesmetrictailscale2otel_api_retries_totalvisualized, alertable, drives_a_variable
tailscale2otel.build_infometrictailscale2otel_build_info_ratiovisualized
tailscale2otel.capability.scope_satisfiedmetrictailscale2otel_capability_scope_satisfied_ratiovisualized
tailscale2otel.capability.statusmetrictailscale2otel_capability_status_ratiovisualized
tailscale2otel.checkpoint.disk.sizemetrictailscale2otel_checkpoint_disk_size_bytesvisualized
tailscale2otel.checkpoint.persist.agemetrictailscale2otel_checkpoint_persist_age_secondsvisualized, alertable
tailscale2otel.checkpoint.persist.errorsmetrictailscale2otel_checkpoint_persist_errors_totalvisualized, alertable
tailscale2otel.component.errorsmetrictailscale2otel_component_errors_totalvisualized, alertable
tailscale2otel.config.validmetrictailscale2otel_config_valid_ratiovisualized, alertable
tailscale2otel.config.warningsmetrictailscale2otel_config_warnings_ratiovisualized, alertable
tailscale2otel.dedup.evictionsmetrictailscale2otel_dedup_evictions_totalvisualized, alertable
tailscale2otel.dedup.hitsmetrictailscale2otel_dedup_hits_totalvisualized
tailscale2otel.dedup.sizemetrictailscale2otel_dedup_size_ratiovisualized
tailscale2otel.enrich.cache_agemetrictailscale2otel_enrich_cache_age_secondsvisualized, alertable
tailscale2otel.enrich.cache_sizemetrictailscale2otel_enrich_cache_size_ratiovisualized
tailscale2otel.export.datapointsmetrictailscale2otel_export_datapoints_totalvisualized, alertable
tailscale2otel.export.diagnostics.suppressedmetrictailscale2otel_export_diagnostics_suppressed_totalvisualized#526 wave ⅔: panel scheduled on health/Delivery (OTLP export).
tailscale2otel.export.durationmetrictailscale2otel_export_duration_secondsvisualized, alertable, recorded, drives_a_variable
tailscale2otel.export.failuresmetrictailscale2otel_export_failures_totalvisualized, alertable, drives_a_variable
tailscale2otel.export.log_recordsmetrictailscale2otel_export_log_records_totalvisualized
tailscale2otel.export.spansmetrictailscale2otel_export_spans_totalvisualized#526 wave ⅔: panel scheduled on health/Delivery (OTLP export).
tailscale2otel.ingest.capture.delaymetrictailscale2otel_ingest_capture_delay_secondsvisualized
tailscale2otel.ingest.event.agemetrictailscale2otel_ingest_event_age_secondsvisualized
tailscale2otel.ingest.last_event_timestampmetrictailscale2otel_ingest_last_event_timestamp_secondsvisualized, alertable, recorded
tailscale2otel.ingest.recordsmetrictailscale2otel_ingest_records_totalvisualized, recorded, drives_a_variable
tailscale2otel.ingest.sizemetrictailscale2otel_ingest_size_bytes_totalvisualized
tailscale2otel.ingest.timestamp_skewmetrictailscale2otel_ingest_timestamp_skew_totalvisualized
tailscale2otel.ingress_wal.completion.markersmetrictailscale2otel_ingress_wal_completion_markers_ratiovisualized
tailscale2otel.ingress_wal.orphan.sizemetrictailscale2otel_ingress_wal_orphan_size_bytesvisualized
tailscale2otel.ingress_wal.orphan.stagesmetrictailscale2otel_ingress_wal_orphan_stages_ratiovisualized
tailscale2otel.ingress_wal.pending.entriesmetrictailscale2otel_ingress_wal_pending_entries_ratiovisualized
tailscale2otel.ingress_wal.pending.sizemetrictailscale2otel_ingress_wal_pending_size_bytesvisualized
tailscale2otel.log.record.truncatedmetrictailscale2otel_log_record_truncated_totalvisualized#526 wave ⅔: panel scheduled on health/Ingestion (log truncation).
tailscale2otel.log.truncated.bytesmetrictailscale2otel_log_truncated_bytes_totalvisualized#526 wave ⅔: panel scheduled on health/Ingestion (log truncation).
tailscale2otel.metrics.auth.rejectedmetrictailscale2otel_metrics_auth_rejected_totalvisualized#526 wave ⅔: panel scheduled on health/Collection (metrics endpoint).
tailscale2otel.metrics.scrape.durationmetrictailscale2otel_metrics_scrape_duration_secondsvisualized#526 wave ⅔: panel scheduled on health/Collection (metrics endpoint).
tailscale2otel.metrics.scrape.gather_errorsmetrictailscale2otel_metrics_scrape_gather_errors_totalvisualized#526 wave ⅔: panel scheduled on health/Collection (metrics endpoint).
tailscale2otel.metrics.scrape.in_flightmetrictailscale2otel_metrics_scrape_in_flightvisualized#526 wave ⅔: panel scheduled on health/Collection (metrics endpoint).
tailscale2otel.metrics.scrape.requestsmetrictailscale2otel_metrics_scrape_requests_totalvisualized#526 wave ⅔: panel scheduled on health/Collection (metrics endpoint).
tailscale2otel.pii_filter.categorymetrictailscale2otel_pii_filter_category_ratiovisualized, drives_a_variable
tailscale2otel.processor.droppedmetrictailscale2otel_processor_dropped_totalvisualized#526 wave ⅔: panel scheduled on health/Ingestion (processor queue).
tailscale2otel.processor.queue.capacitymetrictailscale2otel_processor_queue_capacity_ratiovisualized#526 wave ⅔: panel scheduled on health/Ingestion (processor queue).
tailscale2otel.processor.queue.sizemetrictailscale2otel_processor_queue_size_ratiovisualized#526 wave ⅔: panel scheduled on health/Ingestion (processor queue).
tailscale2otel.profiling.upload.attemptsmetrictailscale2otel_profiling_upload_attempts_totalvisualized#526 wave ⅔: panel scheduled on health/Runtime (profiling upload).
tailscale2otel.profiling.upload.consecutive_failuresmetrictailscale2otel_profiling_upload_consecutive_failures_ratiovisualized#526 wave ⅔: panel scheduled on health/Runtime (profiling upload).
tailscale2otel.profiling.upload.durationmetrictailscale2otel_profiling_upload_duration_secondsvisualized#526 wave ⅔: panel scheduled on health/Runtime (profiling upload).
tailscale2otel.profiling.upload.failuresmetrictailscale2otel_profiling_upload_failures_totalvisualized#526 wave ⅔: panel scheduled on health/Runtime (profiling upload).
tailscale2otel.profiling.upload.last_successmetrictailscale2otel_profiling_upload_last_success_secondsvisualized#526 wave ⅔: panel scheduled on health/Runtime (profiling upload).
tailscale2otel.runtime.gc.countmetrictailscale2otel_runtime_gc_count_totalvisualized
tailscale2otel.runtime.gc.cpu_fractionmetrictailscale2otel_runtime_gc_cpu_fraction_ratiovisualized, alertable
tailscale2otel.runtime.gc.next_targetmetrictailscale2otel_runtime_gc_next_target_bytesvisualized
tailscale2otel.runtime.gc.pause_timemetrictailscale2otel_runtime_gc_pause_time_seconds_totalvisualized
tailscale2otel.runtime.gomaxprocsmetrictailscale2otel_runtime_gomaxprocs_ratiovisualized
tailscale2otel.runtime.goroutinesmetrictailscale2otel_runtime_goroutines_ratiovisualized
tailscale2otel.runtime.memory.allocmetrictailscale2otel_runtime_memory_alloc_bytes_totalvisualized
tailscale2otel.runtime.memory.heap_allocmetrictailscale2otel_runtime_memory_heap_alloc_bytesvisualized
tailscale2otel.runtime.memory.heap_inusemetrictailscale2otel_runtime_memory_heap_inuse_bytesvisualized
tailscale2otel.runtime.memory.heap_objectsmetrictailscale2otel_runtime_memory_heap_objects_ratiovisualized
tailscale2otel.runtime.memory.heap_sysmetrictailscale2otel_runtime_memory_heap_sys_bytesvisualized
tailscale2otel.runtime.memory.stack_inusemetrictailscale2otel_runtime_memory_stack_inuse_bytesvisualized
tailscale2otel.runtime.memory.sysmetrictailscale2otel_runtime_memory_sys_bytesvisualized
tailscale2otel.scrape.budgetmetrictailscale2otel_scrape_budget_ratiovisualized, alertable
tailscale2otel.scrape.durationmetrictailscale2otel_scrape_duration_secondsvisualized#526 wave ⅔: panel scheduled on health/Collection (scrape/poll).
tailscale2otel.scrape.duration.histogrammetrictailscale2otel_scrape_duration_histogram_secondsvisualizedDistribution of collector scrape durations, recorded with the scrape span so an exemplar links a bucket back to the trace. Now visualized: #369's follow-up replaced the flagship dashboard's last-value scrape-duration panel with p50/p95/p99 over this histogram, which is what the issue's acceptance asked for. The pre-existing scrape.duration gauge is retained alongside it.
tailscale2otel.scrape.errorsmetrictailscale2otel_scrape_errors_totalvisualized, alertable, drives_a_variable
tailscale2otel.scrape.last_timestampmetrictailscale2otel_scrape_last_timestamp_secondsvisualized, alertable
tailscale2otel.scrape.stalenessmetrictailscale2otel_scrape_staleness_secondsvisualized, alertable, recorded, drives_a_variable
tailscale2otel.scrape.successmetrictailscale2otel_scrape_success_ratiovisualized, alertable, recorded, drives_a_variable
tailscale2otel.series.activemetrictailscale2otel_series_activevisualized, alertable, recorded, drives_a_variable
tailscale2otel.series.by_groupmetrictailscale2otel_series_by_groupvisualized, recorded
tailscale2otel.series.limitmetrictailscale2otel_series_limitvisualized, alertable
tailscale2otel.series.overflowingmetrictailscale2otel_series_overflowing_ratiovisualized, alertable
tailscale2otel.subrequest.attemptsmetrictailscale2otel_subrequest_attempts_totalvisualized
tailscale2otel.subrequest.coveragemetrictailscale2otel_subrequest_coverage_ratiovisualized
tailscale2otel.subrequest.failuresmetrictailscale2otel_subrequest_failures_totalvisualized
tailscale2otel.tls.cert.not_aftermetrictailscale2otel_tls_cert_not_after_secondsvisualized, alertable#526 wave ⅔: panel scheduled on health/Runtime (TLS cert reload) - ALERTABLE-ONLY today.
tailscale2otel.tls.cert.not_beforemetrictailscale2otel_tls_cert_not_before_secondsvisualized#526 wave ⅔: panel scheduled on health/Runtime (TLS cert reload).
tailscale2otel.tls.cert.reload.failuresmetrictailscale2otel_tls_cert_reload_failures_totalvisualized, alertable#526 wave ⅔: panel scheduled on health/Runtime (TLS cert reload) - ALERTABLE-ONLY today.
tailscale2otel.tls.cert.reload.last_successmetrictailscale2otel_tls_cert_reload_last_success_secondsvisualized#526 wave ⅔: panel scheduled on health/Runtime (TLS cert reload).
tailscale2otel.upmetrictailscale2otel_up_ratiovisualized, alertable, recorded
tailscale2otel.update_availablemetrictailscale2otel_update_available_ratiovisualized, alertable