Skip to content

ci: Add unit test coverage enforcement for AdaptiveTelemetryProcessor (75% min)#185

Open
abhinav1602 wants to merge 5 commits intomainfrom
tests/atp
Open

ci: Add unit test coverage enforcement for AdaptiveTelemetryProcessor (75% min)#185
abhinav1602 wants to merge 5 commits intomainfrom
tests/atp

Conversation

@abhinav1602
Copy link
Contributor

Summary

Adds a dedicated GitHub Actions workflow to enforce unit test coverage for the
adaptivetelemetryprocessor module and fixes macOS test compatibility issues.

Changes

New: Coverage Enforcement Workflow

  • .github/workflows/adaptivetelemetryprocessor-tests.yml — A new CI workflow that:
    • Triggers on PRs and pushes to main when files in
      processor/adaptivetelemetryprocessor/ are modified
    • Runs all unit tests with race detection and coverage profiling
    • Fails the PR if coverage drops below 75%
    • Posts/updates a coverage summary comment on the PR
    • Uploads coverage reports (text, HTML) as artifacts (retained 30 days)
    • Runs cross-platform tests on Windows and macOS after coverage passes

Fix: macOS Test Compatibility

  • processor/adaptivetelemetryprocessor/storage_validation_test.go — Fixed
    tests that were failing on macOS because /var is a symlink to /private/var:
    • TestValidateStoragePath_ValidPaths: Linux-specific path assertions now
      only run on Linux; skipped on macOS with a descriptive message
    • TestPathValidation_EdgeCases: Skipped entirely on macOS with explanation

Why

Previously, there was no mechanism to prevent coverage regressions in the
adaptive telemetry processor. A developer could merge a PR that significantly
reduced test coverage without any CI signal. This workflow ensures:

  1. Every PR touching the processor is automatically tested
  2. Coverage stays at or above 75%
  3. Reviewers see coverage data directly in the PR via an auto-generated comment

How to Verify

cd processor/adaptivetelemetryprocessor
go test -v -race -coverprofile=coverage.out ./...
go tool cover -func=coverage.out | grep total

@abhinav1602 abhinav1602 requested review from a team as code owners March 18, 2026 18:30
@github-actions
Copy link
Contributor

github-actions bot commented Mar 18, 2026

📊 AdaptiveTelemetryProcessor Coverage Report

Metric Value
Total Coverage ✅ 82.1%
Minimum Required 75%
📋 Detailed Coverage by Function
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/anomaly_detection.go:15:	detectAnomalyUtil			100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/anomaly_detection.go:37:	getAnomalyConfig			100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/anomaly_detection.go:52:	initializeMetricHistory			50.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/anomaly_detection.go:59:	checkMetricAnomaly			92.9%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/anomaly_detection.go:93:	updateMetricHistory			100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/anomaly_detection.go:103:	calculateAverage			100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/anomaly_detection.go:112:	calculatePercentageChange		100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/anomaly_detection.go:120:	handleAnomalyDetection			100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/components.go:11:		components				100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/composite_metrics.go:17:	extractMetricValues			89.5%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/composite_metrics.go:55:	shouldProcessMetric			100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/composite_metrics.go:72:	extractSingleMetricValue		75.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/composite_metrics.go:84:	extractGaugeValue			88.9%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/composite_metrics.go:104:	extractSumValue				50.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/composite_metrics.go:125:	calculateCompositeGeneric		92.5%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/config.go:117:		Normalize				74.4%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/config.go:190:		Validate				89.5%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/consume_metrics.go:16:	ConsumeMetrics				85.7%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/consume_metrics.go:49:	logBatchProcessingTime			66.7%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/consume_metrics.go:65:	calculateInputStats			100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/consume_metrics.go:85:	logInputStats				100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/consume_metrics.go:92:	processMetricsWithTiming		100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/consume_metrics.go:100:	handleProcessingError			0.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/consume_metrics.go:115:	validateProcessingResults		60.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/consume_metrics.go:142:	calculateOutputStats			100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/consume_metrics.go:180:	countMetricByType			28.6%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/consume_metrics.go:198:	performMaintenanceTasks			25.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/consume_metrics.go:209:	forwardMetricsToNextConsumer		90.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/dynamic_thresholds.go:18:	updateDynamicThresholds			100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/dynamic_thresholds.go:40:	shouldUpdateDynamicThresholds		100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/dynamic_thresholds.go:65:	initializeDynamicUpdate			100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/dynamic_thresholds.go:102:	computeMetricAverages			100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/dynamic_thresholds.go:125:	processMetricForAverages		86.7%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/dynamic_thresholds.go:154:	finalizeAverages			100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/dynamic_thresholds.go:166:	calculateNewThresholds			100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/dynamic_thresholds.go:184:	getCurrentThresholds			100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/dynamic_thresholds.go:195:	calculateSingleThreshold		100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/dynamic_thresholds.go:226:	applyThresholdConstraints		80.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/dynamic_thresholds.go:241:	applyThresholdUpdates			100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/dynamic_thresholds.go:252:	logThresholdUpdate			80.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/dynamic_thresholds.go:276:	logDetailedThresholds			87.5%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/dynamic_thresholds.go:301:	groupThresholdsByPrefix			100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/dynamic_thresholds.go:317:	formatThresholdEntry			100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/factory.go:22:		NewFactory				100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/factory.go:31:		createDefaultConfig			100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/factory.go:51:		createMetricsProcessor			85.7%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/metric_evaluation.go:21:	newMetricEvaluator			100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/metric_evaluation.go:33:	EvaluateResource			100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/metric_evaluation.go:39:	extractMetricValues			100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/metric_evaluation.go:45:	detectAnomaly				100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/metric_evaluation.go:50:	calculateCompositeScore			100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/metric_evaluation.go:55:	UpdateDynamicThresholds			100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/persistence.go:14:		loadTrackedEntities			95.7%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/persistence.go:62:		persistTrackedEntities			100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/persistence.go:95:		cleanupExpiredEntities			91.7%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/process_metrics.go:19:	processMetrics				100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/process_metrics.go:58:	initializeProcessingContext		100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/process_metrics.go:82:	countMetricsByType			68.8%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/process_metrics.go:115:	handleContextCancellation		100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/process_metrics.go:124:	updateDynamicThresholdsIfNeeded		100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/process_metrics.go:136:	processAllResources			61.1%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/process_metrics.go:175:	processingSingleResource		100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/process_metrics.go:200:	handleIncludedResource			100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/process_metrics.go:231:	handleExcludedResource			100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/process_metrics.go:240:	performPostProcessingTasks		88.9%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/process_metrics.go:273:	countOutputMetrics			100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/process_metrics.go:285:	shouldIncludeResource			100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/process_metrics.go:357:	evaluateExistingEntity			100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/process_metrics.go:375:	evaluateNewEntity			100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/process_metrics.go:403:	checkNewEntityFilterStages		72.7%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/process_metrics.go:431:	updateEntityValues			100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/process_metrics.go:449:	upsertTrackedEntityForIncludeList	60.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/process_metrics.go:467:	checkAnomalyDetectionStage		85.7%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/process_metrics.go:483:	checkThresholdStages			100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/process_metrics.go:491:	checkDynamicThresholds			85.7%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/process_metrics.go:508:	checkStaticThresholds			50.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/process_metrics.go:532:	addMultiMetricData			100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/process_metrics.go:547:	checkMultiMetricStage			16.7%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/process_metrics.go:574:	checkRetentionStages			100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/process_metrics.go:580:	checkAnomalyRetention			20.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/process_metrics.go:602:	checkStandardRetention			75.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/process_metrics.go:620:	createNewTrackedEntity			57.1%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/process_metrics.go:643:	checkNewEntityThresholds		92.3%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/process_metrics.go:678:	checkNewEntityMultiMetric		80.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/process_metrics.go:702:	checkNewEntityAnomaly			33.3%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/process_metrics.go:717:	handleDebugMode				53.6%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/process_metrics.go:771:	setResourceFilterStage			100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/process_metrics.go:776:	generateFilteringSummaryMetrics		87.5%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/process_metrics.go:831:	isResourceTargeted			77.8%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/processor_anomaly.go:8:	detectAnomaly				100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/processor_init.go:17:	newProcessor				91.2%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/processor_init.go:121:	Shutdown				100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/processor_init.go:134:	Start					100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/processor_init.go:139:	Capabilities				100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/resource_utils.go:15:	identifyHostMetricType			76.6%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/resource_utils.go:170:	getResourceType				100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/resource_utils.go:186:	countMetricsInResource			100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/resource_utils.go:197:	updateProcessATPAttribute		85.7%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/storage.go:32:		newFileStorage				0.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/storage.go:41:		newFileStorageForTesting		100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/storage.go:49:		Load					81.8%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/storage.go:71:		Save					83.3%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/storage.go:97:		Close					100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/storage.go:103:		createDirectoryIfNotExists		100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/storage.go:118:		getAllowedStorageDirectory		33.3%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/storage.go:135:		getDefaultStoragePath			100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/storage.go:151:		validateStoragePath			90.9%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/storage.go:189:		checkPathForSymlinks			80.8%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/storage_unix.go:14:		isWindowsReparsePoint			0.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/threshold_ingestion.go:15:	isValidMetricValue			100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/threshold_ingestion.go:20:	isValidThreshold			100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/threshold_ingestion.go:25:	determineEffectiveThreshold		100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/threshold_ingestion.go:45:	addThresholdAttributes			100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/threshold_ingestion.go:55:	captureUsedMetricThresholds		86.4%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/utils.go:20:		buildResourceIdentity			100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/utils.go:41:		getHostName				100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/utils.go:49:		buildHostMetricIdentity			54.5%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/utils.go:74:		buildCPUIdentity			0.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/utils.go:88:		buildProcessIdentity			63.6%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/utils.go:117:		buildPagingIdentity			0.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/utils.go:137:		buildFilesystemIdentity			0.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/utils.go:164:		buildDeviceBasedIdentity		0.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/utils.go:177:		buildSimpleHostIdentity			66.7%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/utils.go:185:		buildServiceIdentity			81.8%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/utils.go:209:		buildFallbackIdentity			93.3%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/utils.go:241:		snapshotResourceAttributes		100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/utils.go:255:		extractProcessName			100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/utils.go:277:		extractProcessExecutablePath		90.9%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/utils.go:336:		isProcessInIncludeList			100.0%
github.com/newrelic/nrdot-collector-components/processor/adaptivetelemetryprocessor/utils.go:374:		isZombieProcess				100.0%
total:														(statements)				82.1%


Coverage report generated by adaptivetelemetryprocessor-tests.yml

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