Nous filtrons juste le SQL hangfire en utilisant un processeur de télémétrie comme celui-ci, dans un projet .net5 asp.net. Notez que nous utilisons une base de données différente pour Hangfire, de sorte que le processeur de télémétrie peut facilement éliminer Hangfire SQL en vérifiant s'il se connecte à la base de données Hangfire.
A l'intérieur Startup.Configure()
:
var hangFireConnectionString = // ... get from somewhere
configuration.TelemetryProcessorChainBuilder
.Use(next => new IgnoreHangfireTelemetry(next,hangFireConnectionString))
.Build();
Voici la classe de processeurs :
public class IgnoreHangfireTelemetry : ITelemetryProcessor
{
private readonly ITelemetryProcessor next;
private readonly string hangfireDashboardPath;
private readonly string sqlDatabase; // name of the hangfire db
public IgnoreHangfireTelemetry(
ITelemetryProcessor next,
string sqlConnectionString = null,
string hangfireDashboardPath = "/hangfire")
{
this.next = next ?? throw new ArgumentNullException(nameof(next));
if (!string.IsNullOrEmpty(sqlConnectionString))
{
var builder = new SqlConnectionStringBuilder(sqlConnectionString);
sqlDatabase = builder.InitialCatalog;
}
this.hangfireDashboardPath = hangfireDashboardPath ?? throw new ArgumentNullException(nameof(hangfireDashboardPath));
}
public void Process(ITelemetry item)
{
var request = item as RequestTelemetry;
// If it's a request for Hangfire Dashboard don't record it
if (request != null
&& request.Url.AbsolutePath.StartsWith(hangfireDashboardPath))
{
return;
}
var telemetry = item as DependencyTelemetry;
// If it's a SQL dependency to the Hangfire db don't record it
if (telemetry != null)
{
if (sqlDatabase != null && telemetry.Type == "SQL"
&& telemetry.Target.EndsWith($"| {sqlDatabase}", StringComparison.OrdinalIgnoreCase))
{
return;
}
if (telemetry.Type == "SQL"
&& telemetry.Name.ToLower().Contains("hangfire")
&& telemetry.Success.GetValueOrDefault(false))
{
return;
}
}
// Looks like it's not Hangfire, process the telemetry as usual.
next.Process(item);
}
}
Si vous n'utilisez pas une base de données Hangfire séparée, vous pouvez réaliser la même chose en inspectant d'autres fichiers DépendanceTélémétrie par exemple, regarder DependencyTelemetry.Data ou .CommandName (qui contient l'instruction SQL) et vérifier s'il contient [Hangfire]
(ou un autre nom de schéma de la base de données si vous avez modifié Hangfire pour utiliser un schéma différent). Si vous ne filtrez que sur sql, vous devrez filtrer quelques commandes supplémentaires. Il suffit d'utiliser le débogueur et de voir celles que vous devez exclure. Par exemple, dans le code ci-dessus, mon sqlBackend
ressemble à ceci (notez que "." est le nom de mon serveur SQL, c'est-à-dire qu'il est exécuté localement, et "Hangfire" est le nom de la base de données où se trouvent mes tables Hangfire) :
Parfois, la propriété sqlBackend.Name a des valeurs telles que . | Hangfire | Open
ou . | Hangfire | sp_getapplock
mais le Target
est toujours ``. | Hangfire`, par exemple :