Skip to content

Commit 21cc0b3

Browse files
authored
[PM-26401] Add logging logic (#6523)
1 parent d40d705 commit 21cc0b3

File tree

5 files changed

+332
-4
lines changed

5 files changed

+332
-4
lines changed

src/Api/AdminConsole/Controllers/EventsController.cs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
using Bit.Api.Models.Response;
55
using Bit.Api.Utilities;
6+
using Bit.Api.Utilities.DiagnosticTools;
67
using Bit.Core.AdminConsole.Repositories;
78
using Bit.Core.Context;
89
using Bit.Core.Enums;
@@ -31,18 +32,21 @@ public class EventsController : Controller
3132
private readonly ISecretRepository _secretRepository;
3233
private readonly IProjectRepository _projectRepository;
3334
private readonly IServiceAccountRepository _serviceAccountRepository;
35+
private readonly ILogger<EventsController> _logger;
36+
private readonly IFeatureService _featureService;
3437

3538

36-
public EventsController(
37-
IUserService userService,
39+
public EventsController(IUserService userService,
3840
ICipherRepository cipherRepository,
3941
IOrganizationUserRepository organizationUserRepository,
4042
IProviderUserRepository providerUserRepository,
4143
IEventRepository eventRepository,
4244
ICurrentContext currentContext,
4345
ISecretRepository secretRepository,
4446
IProjectRepository projectRepository,
45-
IServiceAccountRepository serviceAccountRepository)
47+
IServiceAccountRepository serviceAccountRepository,
48+
ILogger<EventsController> logger,
49+
IFeatureService featureService)
4650
{
4751
_userService = userService;
4852
_cipherRepository = cipherRepository;
@@ -53,6 +57,8 @@ public EventsController(
5357
_secretRepository = secretRepository;
5458
_projectRepository = projectRepository;
5559
_serviceAccountRepository = serviceAccountRepository;
60+
_logger = logger;
61+
_featureService = featureService;
5662
}
5763

5864
[HttpGet("")]
@@ -114,6 +120,9 @@ public async Task<ListResponseModel<EventResponseModel>> GetOrganization(string
114120
var result = await _eventRepository.GetManyByOrganizationAsync(orgId, dateRange.Item1, dateRange.Item2,
115121
new PageOptions { ContinuationToken = continuationToken });
116122
var responses = result.Data.Select(e => new EventResponseModel(e));
123+
124+
_logger.LogAggregateData(_featureService, orgId, responses, continuationToken, start, end);
125+
117126
return new ListResponseModel<EventResponseModel>(responses, result.ContinuationToken);
118127
}
119128

src/Api/AdminConsole/Public/Controllers/EventsController.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@
44
using System.Net;
55
using Bit.Api.Models.Public.Request;
66
using Bit.Api.Models.Public.Response;
7+
using Bit.Api.Utilities.DiagnosticTools;
78
using Bit.Core.Context;
89
using Bit.Core.Models.Data;
910
using Bit.Core.Repositories;
11+
using Bit.Core.Services;
1012
using Bit.Core.Vault.Repositories;
1113
using Microsoft.AspNetCore.Authorization;
1214
using Microsoft.AspNetCore.Mvc;
@@ -20,15 +22,21 @@ public class EventsController : Controller
2022
private readonly IEventRepository _eventRepository;
2123
private readonly ICipherRepository _cipherRepository;
2224
private readonly ICurrentContext _currentContext;
25+
private readonly ILogger<EventsController> _logger;
26+
private readonly IFeatureService _featureService;
2327

2428
public EventsController(
2529
IEventRepository eventRepository,
2630
ICipherRepository cipherRepository,
27-
ICurrentContext currentContext)
31+
ICurrentContext currentContext,
32+
ILogger<EventsController> logger,
33+
IFeatureService featureService)
2834
{
2935
_eventRepository = eventRepository;
3036
_cipherRepository = cipherRepository;
3137
_currentContext = currentContext;
38+
_logger = logger;
39+
_featureService = featureService;
3240
}
3341

3442
/// <summary>
@@ -69,6 +77,8 @@ public async Task<IActionResult> List([FromQuery] EventFilterRequestModel reques
6977

7078
var eventResponses = result.Data.Select(e => new EventResponseModel(e));
7179
var response = new PagedListResponseModel<EventResponseModel>(eventResponses, result.ContinuationToken);
80+
81+
_logger.LogAggregateData(_featureService, _currentContext.OrganizationId!.Value, response, request);
7282
return new JsonResult(response);
7383
}
7484
}
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
using Bit.Api.Models.Public.Request;
2+
using Bit.Api.Models.Public.Response;
3+
using Bit.Core;
4+
using Bit.Core.Services;
5+
6+
namespace Bit.Api.Utilities.DiagnosticTools;
7+
8+
public static class EventDiagnosticLogger
9+
{
10+
public static void LogAggregateData(
11+
this ILogger logger,
12+
IFeatureService featureService,
13+
Guid organizationId,
14+
PagedListResponseModel<EventResponseModel> data, EventFilterRequestModel request)
15+
{
16+
try
17+
{
18+
if (!featureService.IsEnabled(FeatureFlagKeys.EventDiagnosticLogging))
19+
{
20+
return;
21+
}
22+
23+
var orderedRecords = data.Data.OrderBy(e => e.Date).ToList();
24+
var recordCount = orderedRecords.Count;
25+
var newestRecordDate = orderedRecords.LastOrDefault()?.Date.ToString("o");
26+
var oldestRecordDate = orderedRecords.FirstOrDefault()?.Date.ToString("o"); ;
27+
var hasMore = !string.IsNullOrEmpty(data.ContinuationToken);
28+
29+
logger.LogInformation(
30+
"Events query for Organization:{OrgId}. Event count:{Count} newest record:{newestRecord} oldest record:{oldestRecord} HasMore:{HasMore} " +
31+
"Request Filters Start:{QueryStart} End:{QueryEnd} ActingUserId:{ActingUserId} ItemId:{ItemId},",
32+
organizationId,
33+
recordCount,
34+
newestRecordDate,
35+
oldestRecordDate,
36+
hasMore,
37+
request.Start?.ToString("o"),
38+
request.End?.ToString("o"),
39+
request.ActingUserId,
40+
request.ItemId);
41+
}
42+
catch (Exception exception)
43+
{
44+
logger.LogWarning(exception, "Unexpected exception from EventDiagnosticLogger.LogAggregateData");
45+
}
46+
}
47+
48+
public static void LogAggregateData(
49+
this ILogger logger,
50+
IFeatureService featureService,
51+
Guid organizationId,
52+
IEnumerable<Bit.Api.Models.Response.EventResponseModel> data,
53+
string? continuationToken,
54+
DateTime? queryStart = null,
55+
DateTime? queryEnd = null)
56+
{
57+
58+
try
59+
{
60+
if (!featureService.IsEnabled(FeatureFlagKeys.EventDiagnosticLogging))
61+
{
62+
return;
63+
}
64+
65+
var orderedRecords = data.OrderBy(e => e.Date).ToList();
66+
var recordCount = orderedRecords.Count;
67+
var newestRecordDate = orderedRecords.LastOrDefault()?.Date.ToString("o");
68+
var oldestRecordDate = orderedRecords.FirstOrDefault()?.Date.ToString("o"); ;
69+
var hasMore = !string.IsNullOrEmpty(continuationToken);
70+
71+
logger.LogInformation(
72+
"Events query for Organization:{OrgId}. Event count:{Count} newest record:{newestRecord} oldest record:{oldestRecord} HasMore:{HasMore} " +
73+
"Request Filters Start:{QueryStart} End:{QueryEnd}",
74+
organizationId,
75+
recordCount,
76+
newestRecordDate,
77+
oldestRecordDate,
78+
hasMore,
79+
queryStart?.ToString("o"),
80+
queryEnd?.ToString("o"));
81+
}
82+
catch (Exception exception)
83+
{
84+
logger.LogWarning(exception, "Unexpected exception from EventDiagnosticLogger.LogAggregateData");
85+
}
86+
}
87+
}

src/Core/Constants.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,7 @@ public static class FeatureFlagKeys
252252
/* DIRT Team */
253253
public const string PM22887_RiskInsightsActivityTab = "pm-22887-risk-insights-activity-tab";
254254
public const string EventManagementForDataDogAndCrowdStrike = "event-management-for-datadog-and-crowdstrike";
255+
public const string EventDiagnosticLogging = "pm-27666-siem-event-log-debugging";
255256

256257
public static List<string> GetAllKeys()
257258
{

0 commit comments

Comments
 (0)