2025-02-11 18:46:51 +01:00
using Microsoft.ApplicationInsights ;
2025-02-14 17:45:49 +01:00
using Microsoft.ApplicationInsights.Channel ;
2025-02-11 18:46:51 +01:00
using Microsoft.Extensions.Hosting ;
2025-02-14 17:45:49 +01:00
using System.Net.Http.Headers ;
using System.Text ;
2025-02-11 18:46:51 +01:00
namespace Core.Telemetry
{
2025-02-14 17:45:49 +01:00
public class SeqBackgroundService : BackgroundService
{
private readonly IMessageChannel < ITelemetry > _messageChannel ;
private readonly TelemetryClient _telemetryClient ;
private readonly HttpClient _httpClient ;
public SeqBackgroundService ( TelemetryClient telemetryClient ,
IMessageChannel < ITelemetry > messageChannel ,
HttpClient httpClient )
{
_telemetryClient = telemetryClient ;
_messageChannel = messageChannel ;
_httpClient = httpClient ;
_httpClient = new HttpClient ( )
{
BaseAddress = new Uri ( "http://localhost:5341" ) ,
Timeout = TimeSpan . FromSeconds ( 30 )
} ;
_httpClient . DefaultRequestHeaders . Accept . Clear ( ) ;
_httpClient . DefaultRequestHeaders . Accept . Add ( new MediaTypeWithQualityHeaderValue ( "application/json" ) ) ;
}
protected override async Task ExecuteAsync ( CancellationToken stoppingToken )
{
try
{
while ( ! stoppingToken . IsCancellationRequested )
await foreach ( var message in _messageChannel . Reader . ReadAllAsync ( stoppingToken ) )
{
try
{
var eventTelemetry = message as Microsoft . ApplicationInsights . DataContracts . EventTelemetry ;
var level = "Information" ;
var seqEvent = new Dictionary < string , object >
{
{ "@t" , DateTime . UtcNow . ToString ( "o" ) } ,
{ "@mt" , eventTelemetry . Name } ,
{ "@l" , level } // "Information", "Warning", "Error", etc.
} ;
foreach ( var prop in eventTelemetry . Context . GlobalProperties )
{
seqEvent . Add ( prop . Key , prop . Value ) ;
}
var content = new StringContent ( Newtonsoft . Json . JsonConvert . SerializeObject ( seqEvent ) , Encoding . UTF8 , "application/vnd.serilog.clef" ) ;
var key = "4XhWFtY4jJ0NBgohBAFF" ; ;
//Gt8hS9ClGNfOCAdswDlW
var requestMessage = new HttpRequestMessage ( HttpMethod . Post , $"/ingest/clef?apiKey={key}" ) ;
requestMessage . Content = content ;
var response = await _httpClient . SendAsync ( requestMessage , stoppingToken ) ;
response . EnsureSuccessStatusCode ( ) ;
//if (!response.IsSuccessStatusCode)
//{
// _telemetryClient.TrackTrace($"HTTP kald fejlede med status {response.StatusCode}", Microsoft.ApplicationInsights.DataContracts.SeverityLevel.Warning);
// continue;
//}
}
catch ( Exception ex )
{
//_telemetryClient.TrackException(ex); this is disabled for now, we need to think about the channel structure first
}
}
}
catch ( Exception ex )
{
if ( ex is not OperationCanceledException )
{
_telemetryClient . TrackException ( ex ) ;
throw ;
}
_telemetryClient . TrackTrace ( "Service shutdown started" ) ;
}
}
public override async Task StopAsync ( CancellationToken cancellationToken )
{
_messageChannel . Dispose ( ) ;
await base . StopAsync ( cancellationToken ) ;
}
}
2025-02-11 18:46:51 +01:00
}