Skip to content

Commit 0b0b4fb

Browse files
authored
Add setting for backfilling events on setup (#103)
* Add setting for backfill depth * Fix a couple of random bugs * Run formatter * Add chaining to exception
1 parent c086e6d commit 0b0b4fb

8 files changed

Lines changed: 89 additions & 4 deletions

File tree

packages/flare/bin/constants.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ class PasswordKeys(Enum):
1515
INGEST_FULL_EVENT_DATA = "ingest_full_event_data"
1616
SEVERITIES_FILTER = "severities_filter"
1717
SOURCE_TYPES_FILTER = "source_types_filter"
18+
NUMBER_OF_DAYS_TO_BACKFILL = "number_of_days_to_backfill"
1819

1920

2021
class DataStoreKeys(Enum):

packages/flare/bin/cron_job_ingest_events.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,12 @@ def main(
6161
# for identifiers 30 days prior to the day a tenant was first configured.
6262
start_date = data_store.get_earliest_ingested_by_tenant(tenant_id)
6363
if not start_date:
64-
start_date = datetime.now(timezone.utc) - timedelta(days=30)
64+
number_of_days_to_backfill = get_number_of_days_to_backfill(
65+
storage_passwords=storage_passwords
66+
)
67+
start_date = datetime.now(timezone.utc) - timedelta(
68+
days=number_of_days_to_backfill
69+
)
6570
data_store.set_earliest_ingested_by_tenant(tenant_id, start_date)
6671

6772
for event, next_token in fetch_feed(
@@ -142,6 +147,18 @@ def get_api_key(storage_passwords: client.StoragePasswords) -> str:
142147
return api_key
143148

144149

150+
def get_number_of_days_to_backfill(storage_passwords: client.StoragePasswords) -> int:
151+
number_of_days_to_backfill = get_storage_password_value(
152+
storage_passwords=storage_passwords,
153+
password_key=PasswordKeys.NUMBER_OF_DAYS_TO_BACKFILL.value,
154+
)
155+
156+
try:
157+
return int(number_of_days_to_backfill) if number_of_days_to_backfill else 30
158+
except Exception as e:
159+
raise Exception("Number of days to backfill not a number") from e
160+
161+
145162
def get_tenant_ids(storage_passwords: client.StoragePasswords) -> list[int]:
146163
stored_tenant_ids = get_storage_password_value(
147164
storage_passwords=storage_passwords, password_key=PasswordKeys.TENANT_IDS.value

packages/react-components/src/components/ConfigurationUserPreferencesStep.tsx

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import {
2626
saveConfiguration,
2727
convertSourceTypeFilterToArray,
2828
fetchTenantIds,
29+
fetchNumberOfDaysToBackfill,
2930
} from '../utils/setupConfiguration';
3031
import './ConfigurationGlobalStep.css';
3132
import './ConfigurationUserPreferencesStep.css';
@@ -36,6 +37,7 @@ import { ToastKeys, toastManager } from './ToastManager';
3637
import Tooltip from './Tooltip';
3738
import FlareLogoLoading from './FlareLogoLoading';
3839
import TenantSelection from './TenantSelection';
40+
import Input from './Input';
3941

4042
const ConfigurationUserPreferencesStep: FC<{
4143
configurationStep: ConfigurationStep;
@@ -54,6 +56,8 @@ const ConfigurationUserPreferencesStep: FC<{
5456
const [indexNames, setIndexNames] = useState<string[]>([]);
5557
const [isIngestingFullEventData, setIsIngestingFullEventData] = useState(false);
5658
const [isLoading, setIsLoading] = useState(false);
59+
const [numberOfDaysToBackfill, setNumberOfDaysToBackfill] = useState<string>();
60+
const [isFirstSetup, setIsFirstSetup] = useState(false);
5761

5862
const handleIndexNameChange = (e): void => setIndexName(e.target.value);
5963
const handleIsIngestingFullEventDataChange = (e): void =>
@@ -68,7 +72,8 @@ const ConfigurationUserPreferencesStep: FC<{
6872
indexName,
6973
isIngestingFullEventData,
7074
getSeverityFilterValue(selectedSeverities, severities),
71-
getSourceTypesFilterValue(selectedSourceTypes, sourceTypeCategories)
75+
getSourceTypesFilterValue(selectedSourceTypes, sourceTypeCategories),
76+
numberOfDaysToBackfill
7277
)
7378
.then(() => {
7479
setIsLoading(false);
@@ -101,6 +106,7 @@ const ConfigurationUserPreferencesStep: FC<{
101106
fetchSeveritiesFilter(),
102107
fetchSourceTypeFilters(apiKey),
103108
fetchSourceTypesFilter(),
109+
fetchNumberOfDaysToBackfill(),
104110
])
105111
.then(
106112
([
@@ -113,7 +119,14 @@ const ConfigurationUserPreferencesStep: FC<{
113119
severitiesFilter,
114120
allSourceTypeCategories,
115121
sourceTypeFilter,
122+
numberOfDaysToBackfillSaved,
116123
]) => {
124+
// The form can't be submitted without any tenant ids
125+
// so the absence of tenant ids indicates that it is the first setup.
126+
if (!tenantIds.length) {
127+
setIsFirstSetup(true);
128+
}
129+
setNumberOfDaysToBackfill(numberOfDaysToBackfillSaved ?? '');
117130
setSelectedTenantIds(new Set(tenantIds));
118131
setIsIngestingFullEventData(ingestFullEventData);
119132
setIndexName(index);
@@ -265,6 +278,25 @@ const ConfigurationUserPreferencesStep: FC<{
265278
/>
266279
</span>
267280
</div>
281+
<div className="form-item">
282+
<div className="label-tooltip">
283+
<Label>Number of days to backfill events</Label>
284+
<Tooltip>
285+
<div>
286+
This field can only be set when setting up the app for the first
287+
time.
288+
</div>
289+
</Tooltip>
290+
</div>
291+
<Input
292+
onChange={(e): void => setNumberOfDaysToBackfill(e.target.value)}
293+
value={numberOfDaysToBackfill}
294+
min="0"
295+
type="number"
296+
placeholder="30"
297+
disabled={!isFirstSetup}
298+
/>
299+
</div>
268300
<div className="button-group">
269301
<Button onClick={(): void => onNavigateBackClick()} isSecondary>
270302
Back
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
input {
2+
color: var(--text-color);
3+
border: 0px;
4+
outline: none;
5+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import React, { FC } from 'react';
2+
3+
import './Input.css';
4+
5+
const Input: FC<React.ComponentProps<'input'>> = ({ ...props }) => {
6+
return <input {...props} />;
7+
};
8+
9+
export default Input;

packages/react-components/src/global.css

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,17 @@ input {
7777
border: 1px solid var(--secondary-text-color);
7878
border-radius: 40px;
7979
margin-top: 0.5rem;
80+
81+
&:disabled {
82+
cursor: not-allowed;
83+
color: var(--secondary-text-color);
84+
}
8085
}
8186

8287
input:hover {
83-
border: 1px solid var(--button-bg-color);
88+
:not(:disabled) {
89+
border: 1px solid var(--button-bg-color);
90+
}
8491
}
8592

8693
input::placeholder {

packages/react-components/src/models/constants.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,5 @@ export enum PasswordKeys {
1616
INGEST_FULL_EVENT_DATA = 'ingest_full_event_data',
1717
SEVERITIES_FILTER = 'severities_filter',
1818
SOURCE_TYPES_FILTER = 'source_types_filter',
19+
NUMBER_OF_DAYS_TO_BACKFILL = 'number_of_days_to_backfill',
1920
}

packages/react-components/src/utils/setupConfiguration.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,8 @@ async function saveConfiguration(
121121
indexName: string,
122122
isIngestingFullEventData: boolean,
123123
severitiesFilter: string,
124-
sourceTypesFilter: string
124+
sourceTypesFilter: string,
125+
numberOfDaysToBackfill?: string
125126
): Promise<void> {
126127
const service = createService();
127128
const storagePasswords = await promisify(service.storagePasswords().fetch)();
@@ -132,6 +133,11 @@ async function saveConfiguration(
132133
PasswordKeys.INGEST_FULL_EVENT_DATA,
133134
`${isIngestingFullEventData}`
134135
);
136+
await savePassword(
137+
storagePasswords,
138+
PasswordKeys.NUMBER_OF_DAYS_TO_BACKFILL,
139+
numberOfDaysToBackfill ?? ''
140+
);
135141
await savePassword(storagePasswords, PasswordKeys.SEVERITIES_FILTER, `${severitiesFilter}`);
136142
await savePassword(storagePasswords, PasswordKeys.SOURCE_TYPES_FILTER, `${sourceTypesFilter}`);
137143
await saveIndexForIngestion(service, indexName);
@@ -244,6 +250,12 @@ async function fetchTenantIds(): Promise<number[]> {
244250
});
245251
}
246252

253+
async function fetchNumberOfDaysToBackfill(): Promise<string | undefined> {
254+
return fetchPassword(PasswordKeys.NUMBER_OF_DAYS_TO_BACKFILL).then((numberOfDaysToBackfill) => {
255+
return numberOfDaysToBackfill;
256+
});
257+
}
258+
247259
async function fetchIngestFullEventData(): Promise<boolean> {
248260
return fetchPassword(PasswordKeys.INGEST_FULL_EVENT_DATA).then((isIngestingFullEventData) => {
249261
return isIngestingFullEventData === 'true';
@@ -446,6 +458,7 @@ export {
446458
fetchSeveritiesFilter,
447459
fetchSourceTypeFilters,
448460
fetchSourceTypesFilter,
461+
fetchNumberOfDaysToBackfill,
449462
fetchTenantIds,
450463
fetchUserTenants,
451464
fetchVersionName,

0 commit comments

Comments
 (0)