From 4d82c346e307b3d77fcfa015d2b0e4f844d3a7b1 Mon Sep 17 00:00:00 2001 From: master <> Date: Mon, 6 Apr 2026 08:51:27 +0300 Subject: [PATCH] Tag all Valkey/Redis connections with service-specific ClientName Set ClientName on every Redis/Valkey connection across Scanner, Signals, Concelier, Notify, Scheduler, Timeline, and Router for easier connection attribution in monitoring. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../ConcelierCacheConnectionFactory.cs | 1 + .../StellaOps.Concelier.Cache.Valkey/TASKS.md | 1 + .../GraphJobs/Events/RedisConnectionFactory.cs | 1 + .../Redis/RedisSchedulerQueueBase.cs | 1 + .../StellaOps.Scheduler.Queue/TASKS.md | 1 + .../Redis/RedisNotifyDeliveryQueue.cs | 1 + .../Redis/RedisNotifyEventQueue.cs | 1 + .../__Libraries/StellaOps.Notify.Queue/TASKS.md | 1 + .../PostgresConnectionFactory.cs | 7 ++++++- .../StellaOps.Messaging.Transport.Postgres/TASKS.md | 1 + .../StellaOps.Messaging.Transport.Valkey/TASKS.md | 1 + .../ValkeyConnectionFactory.cs | 1 + .../RateLimit/ValkeyRateLimitStore.cs | 5 +++-- .../__Libraries/StellaOps.Router.Gateway/TASKS.md | 1 + .../Services/RedisConnectionFactory.cs | 1 + src/Scanner/StellaOps.Scanner.WebService/TASKS.md | 1 + .../Caching/ValkeyCallGraphCacheService.cs | 2 +- .../StellaOps.Scanner.CallGraph/TASKS.md | 1 + .../StellaOps.Scanner.Queue/Redis/RedisScanQueue.cs | 1 + .../__Libraries/StellaOps.Scanner.Queue/TASKS.md | 1 + src/Signals/StellaOps.Signals/Program.cs | 12 +++++++++++- .../Services/RedisConnectionFactory.cs | 1 + .../Services/RedisReachabilityCache.cs | 13 +++---------- src/Signals/StellaOps.Signals/TASKS.md | 1 + .../Subscriptions/RedisTimelineEventSubscriber.cs | 4 +++- .../TASKS.md | 1 + 26 files changed, 47 insertions(+), 16 deletions(-) diff --git a/src/Concelier/__Libraries/StellaOps.Concelier.Cache.Valkey/ConcelierCacheConnectionFactory.cs b/src/Concelier/__Libraries/StellaOps.Concelier.Cache.Valkey/ConcelierCacheConnectionFactory.cs index 0d027a40a..088b3a625 100644 --- a/src/Concelier/__Libraries/StellaOps.Concelier.Cache.Valkey/ConcelierCacheConnectionFactory.cs +++ b/src/Concelier/__Libraries/StellaOps.Concelier.Cache.Valkey/ConcelierCacheConnectionFactory.cs @@ -91,6 +91,7 @@ public sealed class ConcelierCacheConnectionFactory : IAsyncDisposable config.AsyncTimeout = (int)_options.AsyncTimeout.TotalMilliseconds; config.ConnectRetry = _options.ConnectRetry; config.DefaultDatabase = _options.Database; + config.ClientName ??= "stellaops-concelier-cache"; _logger?.LogDebug("Connecting to Valkey at {Endpoint} (database {Database})", _options.ConnectionString, _options.Database); diff --git a/src/Concelier/__Libraries/StellaOps.Concelier.Cache.Valkey/TASKS.md b/src/Concelier/__Libraries/StellaOps.Concelier.Cache.Valkey/TASKS.md index a2a078393..b4f4b29ca 100644 --- a/src/Concelier/__Libraries/StellaOps.Concelier.Cache.Valkey/TASKS.md +++ b/src/Concelier/__Libraries/StellaOps.Concelier.Cache.Valkey/TASKS.md @@ -5,6 +5,7 @@ Source of truth: `docs-archived/implplan/2025-12-29-csproj-audit/SPRINT_20251229 | Task ID | Status | Notes | | --- | --- | --- | +| SPRINT_20260405_011-XPORT-VALKEY | DONE | `docs/implplan/SPRINT_20260405_011___Libraries_transport_pooling_and_attribution_hardening.md`: named Concelier advisory-cache Valkey client construction. | | AUDIT-0145-M | DONE | Revalidated 2026-01-06. | | AUDIT-0145-T | DONE | Revalidated 2026-01-06. | | AUDIT-0145-A | TODO | Revalidated 2026-01-06 (open findings: warmup determinism, invariant parsing, missing tests). | diff --git a/src/JobEngine/StellaOps.Scheduler.WebService/GraphJobs/Events/RedisConnectionFactory.cs b/src/JobEngine/StellaOps.Scheduler.WebService/GraphJobs/Events/RedisConnectionFactory.cs index 31180c331..a4750f75b 100644 --- a/src/JobEngine/StellaOps.Scheduler.WebService/GraphJobs/Events/RedisConnectionFactory.cs +++ b/src/JobEngine/StellaOps.Scheduler.WebService/GraphJobs/Events/RedisConnectionFactory.cs @@ -7,6 +7,7 @@ internal sealed class RedisConnectionFactory : IRedisConnectionFactory public async Task ConnectAsync(ConfigurationOptions options, CancellationToken cancellationToken) { ArgumentNullException.ThrowIfNull(options); + options.ClientName ??= "stellaops-scheduler-graph-events"; var completionSource = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); cancellationToken.Register(() => completionSource.TrySetCanceled(cancellationToken)); diff --git a/src/JobEngine/StellaOps.Scheduler.__Libraries/StellaOps.Scheduler.Queue/Redis/RedisSchedulerQueueBase.cs b/src/JobEngine/StellaOps.Scheduler.__Libraries/StellaOps.Scheduler.Queue/Redis/RedisSchedulerQueueBase.cs index a2fa06f1f..3fc8bba75 100644 --- a/src/JobEngine/StellaOps.Scheduler.__Libraries/StellaOps.Scheduler.Queue/Redis/RedisSchedulerQueueBase.cs +++ b/src/JobEngine/StellaOps.Scheduler.__Libraries/StellaOps.Scheduler.Queue/Redis/RedisSchedulerQueueBase.cs @@ -497,6 +497,7 @@ internal abstract class RedisSchedulerQueueBase : ISchedulerQueue ConnectAsync(ConfigurationOptions options, CancellationToken cancellationToken) { ArgumentNullException.ThrowIfNull(options); + options.ClientName ??= "stellaops-scanner-events"; var connectTask = ConnectionMultiplexer.ConnectAsync(options); var connection = await connectTask.WaitAsync(cancellationToken).ConfigureAwait(false); return connection; diff --git a/src/Scanner/StellaOps.Scanner.WebService/TASKS.md b/src/Scanner/StellaOps.Scanner.WebService/TASKS.md index c6206ef0a..685f7a6d4 100644 --- a/src/Scanner/StellaOps.Scanner.WebService/TASKS.md +++ b/src/Scanner/StellaOps.Scanner.WebService/TASKS.md @@ -5,6 +5,7 @@ Source of truth: `docs/implplan/SPRINT_20260112_003_BE_csproj_audit_pending_appl | Task ID | Status | Notes | | --- | --- | --- | +| SPRINT_20260405_011-XPORT-VALKEY | DONE | `docs/implplan/SPRINT_20260405_011___Libraries_transport_pooling_and_attribution_hardening.md`: named the scanner webservice event Valkey client construction path. | | QA-SCANNER-VERIFY-008 | DONE | `SPRINT_20260212_002_Scanner_unchecked_feature_verification_batch1.md`: verified entry-trace response contract carries `graph.binaryIntelligence` for scanner binary intelligence feature (run-002, 2026-02-12). | | TODO-WEB-001 | TODO | Load tenant-specific policy configuration in `src/Scanner/StellaOps.Scanner.WebService/Services/VexGateQueryService.cs`. | | TODO-WEB-002 | TODO | Implement CAS retrieval for slices in `src/Scanner/StellaOps.Scanner.WebService/Services/SliceQueryService.cs`. | diff --git a/src/Scanner/__Libraries/StellaOps.Scanner.CallGraph/Caching/ValkeyCallGraphCacheService.cs b/src/Scanner/__Libraries/StellaOps.Scanner.CallGraph/Caching/ValkeyCallGraphCacheService.cs index 3445222b7..eee5e405d 100644 --- a/src/Scanner/__Libraries/StellaOps.Scanner.CallGraph/Caching/ValkeyCallGraphCacheService.cs +++ b/src/Scanner/__Libraries/StellaOps.Scanner.CallGraph/Caching/ValkeyCallGraphCacheService.cs @@ -209,6 +209,7 @@ public sealed class ValkeyCallGraphCacheService : ICallGraphCacheService, IAsync } var config = ConfigurationOptions.Parse(_options.ConnectionString); + config.ClientName ??= "stellaops-scanner-callgraph-cache"; _connection = await _connectionFactory(config).ConfigureAwait(false); return _connection; } @@ -240,4 +241,3 @@ public sealed class ValkeyCallGraphCacheService : ICallGraphCacheService, IAsync return output.ToArray(); } } - diff --git a/src/Scanner/__Libraries/StellaOps.Scanner.CallGraph/TASKS.md b/src/Scanner/__Libraries/StellaOps.Scanner.CallGraph/TASKS.md index 6ba7e7ed4..dbf6c24c2 100644 --- a/src/Scanner/__Libraries/StellaOps.Scanner.CallGraph/TASKS.md +++ b/src/Scanner/__Libraries/StellaOps.Scanner.CallGraph/TASKS.md @@ -4,5 +4,6 @@ Source of truth: `docs/implplan/SPRINT_20260130_002_Tools_csproj_remediation_sol | Task ID | Status | Notes | | --- | --- | --- | +| SPRINT_20260405_011-XPORT-VALKEY | DONE | `docs/implplan/SPRINT_20260405_011___Libraries_transport_pooling_and_attribution_hardening.md`: named scanner call-graph cache Valkey client construction. | | REMED-05 | TODO | Remediation checklist: docs/implplan/audits/csproj-standards/remediation/checklists/src/Scanner/__Libraries/StellaOps.Scanner.CallGraph/StellaOps.Scanner.CallGraph.md. | | REMED-06 | DONE | SOLID review notes captured for SPRINT_20260130_002. | diff --git a/src/Scanner/__Libraries/StellaOps.Scanner.Queue/Redis/RedisScanQueue.cs b/src/Scanner/__Libraries/StellaOps.Scanner.Queue/Redis/RedisScanQueue.cs index 7d0d6fbf3..c304cadfd 100644 --- a/src/Scanner/__Libraries/StellaOps.Scanner.Queue/Redis/RedisScanQueue.cs +++ b/src/Scanner/__Libraries/StellaOps.Scanner.Queue/Redis/RedisScanQueue.cs @@ -502,6 +502,7 @@ internal sealed class RedisScanQueue : IScanQueue, IAsyncDisposable config.AbortOnConnectFail = false; config.ConnectTimeout = (int)_options.InitializationTimeout.TotalMilliseconds; config.ConnectRetry = 3; + config.ClientName ??= "stellaops-scanner-queue"; if (_options.Database is not null) { config.DefaultDatabase = _options.Database; diff --git a/src/Scanner/__Libraries/StellaOps.Scanner.Queue/TASKS.md b/src/Scanner/__Libraries/StellaOps.Scanner.Queue/TASKS.md index db3e9721d..170ab04ac 100644 --- a/src/Scanner/__Libraries/StellaOps.Scanner.Queue/TASKS.md +++ b/src/Scanner/__Libraries/StellaOps.Scanner.Queue/TASKS.md @@ -4,5 +4,6 @@ Source of truth: `docs/implplan/SPRINT_20260130_002_Tools_csproj_remediation_sol | Task ID | Status | Notes | | --- | --- | --- | +| SPRINT_20260405_011-XPORT-VALKEY | DONE | `docs/implplan/SPRINT_20260405_011___Libraries_transport_pooling_and_attribution_hardening.md`: named scanner queue Valkey client construction. | | REMED-05 | TODO | Remediation checklist: docs/implplan/audits/csproj-standards/remediation/checklists/src/Scanner/__Libraries/StellaOps.Scanner.Queue/StellaOps.Scanner.Queue.md. | | REMED-06 | DONE | SOLID review notes captured for SPRINT_20260130_002. | diff --git a/src/Signals/StellaOps.Signals/Program.cs b/src/Signals/StellaOps.Signals/Program.cs index 7a944bc54..c2f0421d5 100644 --- a/src/Signals/StellaOps.Signals/Program.cs +++ b/src/Signals/StellaOps.Signals/Program.cs @@ -3,6 +3,7 @@ using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; using NetEscapades.Configuration.Yaml; +using StackExchange.Redis; using StellaOps.Auth.Abstractions; using StellaOps.Auth.ServerIntegration; using StellaOps.Auth.ServerIntegration.Tenancy; @@ -133,10 +134,19 @@ builder.Services.AddSingleton(new SimpleJsonCallgraphParser("g builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); +builder.Services.AddSingleton(sp => +{ + var options = sp.GetRequiredService>().Value; + var configuration = ConfigurationOptions.Parse(options.Cache.ConnectionString); + configuration.ClientName ??= "stellaops-signals-cache"; + return ConnectionMultiplexer.Connect(configuration); +}); builder.Services.AddSingleton(sp => { var options = sp.GetRequiredService>().Value; - return new RedisReachabilityCache(options.Cache); + return new RedisReachabilityCache( + options.Cache, + sp.GetRequiredService()); }); builder.Services.AddSingleton(); builder.Services.AddSingleton(); diff --git a/src/Signals/StellaOps.Signals/Services/RedisConnectionFactory.cs b/src/Signals/StellaOps.Signals/Services/RedisConnectionFactory.cs index 13ba85d96..798bc561c 100644 --- a/src/Signals/StellaOps.Signals/Services/RedisConnectionFactory.cs +++ b/src/Signals/StellaOps.Signals/Services/RedisConnectionFactory.cs @@ -10,6 +10,7 @@ internal sealed class RedisConnectionFactory : IRedisConnectionFactory public async Task ConnectAsync(ConfigurationOptions options, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); + options.ClientName ??= "stellaops-signals-events"; return await ConnectionMultiplexer.ConnectAsync(options).ConfigureAwait(false); } } diff --git a/src/Signals/StellaOps.Signals/Services/RedisReachabilityCache.cs b/src/Signals/StellaOps.Signals/Services/RedisReachabilityCache.cs index 39d14f24a..bfbcadd15 100644 --- a/src/Signals/StellaOps.Signals/Services/RedisReachabilityCache.cs +++ b/src/Signals/StellaOps.Signals/Services/RedisReachabilityCache.cs @@ -9,21 +9,19 @@ using System.Threading.Tasks; namespace StellaOps.Signals.Services; -internal sealed class RedisReachabilityCache : IReachabilityCache, IDisposable +internal sealed class RedisReachabilityCache : IReachabilityCache { private readonly SignalsCacheOptions options; - private readonly ConnectionMultiplexer multiplexer; private readonly IDatabase database; private static readonly JsonSerializerOptions SerializerOptions = new(JsonSerializerDefaults.Web) { WriteIndented = false }; - public RedisReachabilityCache(SignalsCacheOptions options) + public RedisReachabilityCache(SignalsCacheOptions options, IConnectionMultiplexer multiplexer) { this.options = options ?? throw new ArgumentNullException(nameof(options)); - multiplexer = ConnectionMultiplexer.Connect(options.ConnectionString); - database = multiplexer.GetDatabase(); + this.database = (multiplexer ?? throw new ArgumentNullException(nameof(multiplexer))).GetDatabase(); } public async Task GetAsync(string subjectKey, CancellationToken cancellationToken) @@ -68,10 +66,5 @@ internal sealed class RedisReachabilityCache : IReachabilityCache, IDisposable await database.KeyDeleteAsync(GetCacheKey(subjectKey)).ConfigureAwait(false); } - public void Dispose() - { - multiplexer?.Dispose(); - } - private static string GetCacheKey(string subjectKey) => $"reachability_cache:{subjectKey}"; } diff --git a/src/Signals/StellaOps.Signals/TASKS.md b/src/Signals/StellaOps.Signals/TASKS.md index 26473803c..d505e3ad6 100644 --- a/src/Signals/StellaOps.Signals/TASKS.md +++ b/src/Signals/StellaOps.Signals/TASKS.md @@ -5,5 +5,6 @@ Source of truth: `docs/implplan/SPRINT_20260112_003_BE_csproj_audit_pending_appl | Task ID | Status | Notes | | --- | --- | --- | +| SPRINT_20260405_011-XPORT-VALKEY | DONE | `docs/implplan/SPRINT_20260405_011___Libraries_transport_pooling_and_attribution_hardening.md`: named Signals cache/events Valkey clients and moved the reachability cache onto a shared DI multiplexer. | | AUDIT-HOTLIST-SIGNALS-0001 | DONE | Hotlist apply for `src/Signals/StellaOps.Signals/StellaOps.Signals.csproj`; audit tracker updated. | | MWD-001 | DONE | Implemented deterministic BTF fallback selection and metadata emission for runtime eBPF collection (`source_kind`, `source_path`, `source_digest`, `selection_reason`); verified with Signals and Scanner tests. | diff --git a/src/Timeline/__Libraries/StellaOps.TimelineIndexer.Infrastructure/Subscriptions/RedisTimelineEventSubscriber.cs b/src/Timeline/__Libraries/StellaOps.TimelineIndexer.Infrastructure/Subscriptions/RedisTimelineEventSubscriber.cs index 650dbc39e..8ad197132 100644 --- a/src/Timeline/__Libraries/StellaOps.TimelineIndexer.Infrastructure/Subscriptions/RedisTimelineEventSubscriber.cs +++ b/src/Timeline/__Libraries/StellaOps.TimelineIndexer.Infrastructure/Subscriptions/RedisTimelineEventSubscriber.cs @@ -37,7 +37,9 @@ public sealed class RedisTimelineEventSubscriber : ITimelineEventSubscriber, IAs yield break; } - _connection = await ConnectionMultiplexer.ConnectAsync(cfg.ConnectionString); + var redisOptions = ConfigurationOptions.Parse(cfg.ConnectionString); + redisOptions.ClientName ??= "stellaops-timeline-indexer-subscriber"; + _connection = await ConnectionMultiplexer.ConnectAsync(redisOptions); var db = _connection.GetDatabase(); await EnsureGroupAsync(db, cfg, cancellationToken).ConfigureAwait(false); diff --git a/src/Timeline/__Libraries/StellaOps.TimelineIndexer.Infrastructure/TASKS.md b/src/Timeline/__Libraries/StellaOps.TimelineIndexer.Infrastructure/TASKS.md index 2a667f43c..2c7a4e57e 100644 --- a/src/Timeline/__Libraries/StellaOps.TimelineIndexer.Infrastructure/TASKS.md +++ b/src/Timeline/__Libraries/StellaOps.TimelineIndexer.Infrastructure/TASKS.md @@ -6,6 +6,7 @@ Source of truth: | Task ID | Status | Notes | | --- | --- | --- | +| SPRINT_20260405_011-XPORT-VALKEY | DONE | `docs/implplan/SPRINT_20260405_011___Libraries_transport_pooling_and_attribution_hardening.md`: named the Timeline indexer Valkey subscription client. | | REMED-05 | TODO | Remediation checklist: docs/implplan/audits/csproj-standards/remediation/checklists/src/TimelineIndexer/StellaOps.TimelineIndexer/StellaOps.TimelineIndexer.Infrastructure/StellaOps.TimelineIndexer.Infrastructure.md. | | REMED-06 | DONE | SOLID review notes captured for SPRINT_20260130_002. | | TLI-EF-01 | DONE | EF Core scaffold baseline generated for timeline schema tables. |