( ctx context.Context, vultureConfig vultureConfiguration, pushEndpoint string, logger *zap.Logger, )
| 17 | const TempoAccessPolicyToken = "TEMPO_ACCESS_POLICY_TOKEN" |
| 18 | |
| 19 | func RunValidationMode( |
| 20 | ctx context.Context, |
| 21 | vultureConfig vultureConfiguration, |
| 22 | pushEndpoint string, |
| 23 | logger *zap.Logger, |
| 24 | ) int { |
| 25 | accessPolicyToken := os.Getenv(TempoAccessPolicyToken) |
| 26 | if accessPolicyToken == "" { |
| 27 | logger.Error("TEMPO_ACCESS_POLICY_TOKEN environment variable is required in validation mode") |
| 28 | return 1 |
| 29 | } |
| 30 | |
| 31 | // Construct the basic auth token for HTTP headers |
| 32 | basicAuthToken := constructAuthToken(vultureConfig.tempoOrgID, accessPolicyToken) |
| 33 | |
| 34 | httpClient := httpclient.New(vultureConfig.tempoQueryURL, vultureConfig.tempoOrgID) |
| 35 | httpClient.SetHeader("Authorization", fmt.Sprintf("Basic %s", basicAuthToken)) |
| 36 | |
| 37 | // Create authenticated jaeger client for writing traces |
| 38 | authJaegerClient, err := utilpkg.NewJaegerToOTLPExporterWithAuth( |
| 39 | pushEndpoint, |
| 40 | vultureConfig.tempoOrgID, |
| 41 | basicAuthToken, |
| 42 | vultureConfig.tempoPushTLS, |
| 43 | ) |
| 44 | if err != nil { |
| 45 | logger.Error("failed to create authenticated OTLP exporter", zap.Error(err)) |
| 46 | os.Exit(1) |
| 47 | } |
| 48 | |
| 49 | logger.Info("Running in validation mode", |
| 50 | zap.Int("cycles", validationCycles), |
| 51 | zap.Duration("timeout", validationTimeout), |
| 52 | zap.String("org_id", vultureConfig.tempoOrgID), |
| 53 | ) |
| 54 | |
| 55 | validationConfig := ValidationConfig{ |
| 56 | Cycles: validationCycles, |
| 57 | TempoOrgID: vultureConfig.tempoOrgID, |
| 58 | TempoBasicAuthToken: basicAuthToken, |
| 59 | WriteBackoffDuration: vultureConfig.tempoWriteBackoffDuration, |
| 60 | SearchBackoffDuration: vultureConfig.tempoSearchBackoffDuration, |
| 61 | } |
| 62 | |
| 63 | service := NewValidationService(validationConfig, RealClock{}, logger) |
| 64 | |
| 65 | result := service.RunValidation(ctx, authJaegerClient, httpClient, httpClient) |
| 66 | |
| 67 | // Log detailed results before exiting |
| 68 | logger.Info("Validation completed", |
| 69 | zap.Int("total_traces", result.TotalTraces), |
| 70 | zap.Int("validations_passed", result.SuccessCount), |
| 71 | zap.Int("validations_failed", len(result.Failures)), |
| 72 | zap.Duration("duration", result.Duration), |
| 73 | ) |
| 74 | |
| 75 | // Optionally log each failure for debugging |
| 76 | for _, failure := range result.Failures { |
no test coverage detected