diff --git a/changelog/17935.txt b/changelog/17935.txt new file mode 100644 index 000000000..c16ffdfe3 --- /dev/null +++ b/changelog/17935.txt @@ -0,0 +1,3 @@ +```release-note:bug +core/activity: return partial month counts when querying a historical date range and no historical data exists. +``` diff --git a/vault/activity_log.go b/vault/activity_log.go index d9ef3fcc5..970cef996 100644 --- a/vault/activity_log.go +++ b/vault/activity_log.go @@ -1546,10 +1546,19 @@ func (a *ActivityLog) handleQuery(ctx context.Context, startTime, endTime time.T return nil, err } if storedQuery == nil { - return nil, nil + // If the storedQuery is nil, that means there's no historical data to process. But, it's possible there's + // still current month data to process, so rather than returning a 204, let's proceed along like we're + // just querying the current month. + storedQuery = &activity.PrecomputedQuery{ + StartTime: startTime, + EndTime: endTime, + Namespaces: make([]*activity.NamespaceRecord, 0), + Months: make([]*activity.MonthRecord, 0), + } } pq = storedQuery } + // Calculate the namespace response breakdowns and totals for entities and tokens from the initial // namespace data. totalEntities, totalTokens, byNamespaceResponse, err := a.calculateByNamespaceResponseForQuery(ctx, pq.Namespaces) @@ -1584,6 +1593,7 @@ func (a *ActivityLog) handleQuery(ctx context.Context, startTime, endTime time.T // Add the current month's namespace data the precomputed query namespaces byNamespaceResponse = append(byNamespaceResponse, byNamespaceResponseCurrent...) } + // Sort clients within each namespace a.sortALResponseNamespaces(byNamespaceResponse) @@ -1597,11 +1607,13 @@ func (a *ActivityLog) handleQuery(ctx context.Context, startTime, endTime time.T if err != nil { return nil, err } + // Add the namespace attribution for the current month to the newly computed current month value. Note // that transformMonthBreakdowns calculates a superstruct of the required namespace struct due to its // primary use-case being for precomputedQueryWorker, but we will reuse this code for brevity and extract // the namespaces from it. currentMonthNamespaceAttribution := a.transformMonthBreakdowns(partialByMonth) + // Ensure that there is only one element in this list -- if not, warn. if len(currentMonthNamespaceAttribution) > 1 { a.logger.Warn("more than one month worth of namespace and mount attribution calculated for "+