-
Notifications
You must be signed in to change notification settings - Fork 8.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[APM] Integrate Alert Search bar in alert tab #149610
Changes from 5 commits
d2a6594
ea7c2c5
670f085
2ff6cf6
ac5ce29
aac41ce
4bf78b2
042aeb4
9b1027a
ce3b2ce
1e899e0
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
This file was deleted.
Original file line number | Diff line number | Diff line change | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -6,82 +6,118 @@ | |||||||||||||||||
*/ | ||||||||||||||||||
|
||||||||||||||||||
import React, { useState, useMemo } from 'react'; | ||||||||||||||||||
import { useHistory } from 'react-router-dom'; | ||||||||||||||||||
import { ObservabilityAlertSearchBar } from '@kbn/observability-plugin/public'; | ||||||||||||||||||
import { AlertStatus } from '@kbn/observability-plugin/common/typings'; | ||||||||||||||||||
import { EuiPanel, EuiFlexItem, EuiFlexGroup } from '@elastic/eui'; | ||||||||||||||||||
import { ALERT_STATUS } from '@kbn/rule-data-utils'; | ||||||||||||||||||
import { BoolQuery } from '@kbn/es-query'; | ||||||||||||||||||
import { AlertConsumers } from '@kbn/rule-data-utils'; | ||||||||||||||||||
import { useKibana } from '@kbn/kibana-react-plugin/public'; | ||||||||||||||||||
import { ApmPluginStartDeps } from '../../../plugin'; | ||||||||||||||||||
import { useAnyOfApmParams } from '../../../hooks/use_apm_params'; | ||||||||||||||||||
import { SERVICE_NAME } from '../../../../common/es_fields/apm'; | ||||||||||||||||||
import { environmentQuery } from '../../../../common/utils/environment_query'; | ||||||||||||||||||
import { | ||||||||||||||||||
AlertsTableStatusFilter, | ||||||||||||||||||
ALL_ALERTS_FILTER, | ||||||||||||||||||
AlertStatusFilterButton, | ||||||||||||||||||
} from './alerts_table_status_filter'; | ||||||||||||||||||
import { getEnvironmentKuery } from '../../../../common/environment_filter_values'; | ||||||||||||||||||
import { push } from '../../shared/links/url_helpers'; | ||||||||||||||||||
|
||||||||||||||||||
export const ALERT_STATUS_ALL = 'all'; | ||||||||||||||||||
|
||||||||||||||||||
export function AlertsOverview() { | ||||||||||||||||||
const history = useHistory(); | ||||||||||||||||||
const { | ||||||||||||||||||
path: { serviceName }, | ||||||||||||||||||
query: { environment }, | ||||||||||||||||||
query: { environment, rangeFrom, rangeTo, kuery }, | ||||||||||||||||||
} = useAnyOfApmParams( | ||||||||||||||||||
'/services/{serviceName}/alerts', | ||||||||||||||||||
'/mobile-services/{serviceName}/alerts' | ||||||||||||||||||
); | ||||||||||||||||||
const { services } = useKibana<ApmPluginStartDeps>(); | ||||||||||||||||||
const [alertStatusFilter, setAlertStatusFilter] = | ||||||||||||||||||
useState<AlertStatusFilterButton>(ALL_ALERTS_FILTER); | ||||||||||||||||||
useState<AlertStatus>(ALERT_STATUS_ALL); | ||||||||||||||||||
const [esQuery, setEsQuery] = useState<{ bool: BoolQuery }>(); | ||||||||||||||||||
|
||||||||||||||||||
const { | ||||||||||||||||||
triggersActionsUi: { | ||||||||||||||||||
getAlertsStateTable: AlertsStateTable, | ||||||||||||||||||
getAlertsSearchBar: AlertsSearchBar, | ||||||||||||||||||
alertsTableConfigurationRegistry, | ||||||||||||||||||
}, | ||||||||||||||||||
notifications, | ||||||||||||||||||
data: { | ||||||||||||||||||
query: { | ||||||||||||||||||
timefilter: { timefilter: timeFilterService }, | ||||||||||||||||||
}, | ||||||||||||||||||
}, | ||||||||||||||||||
} = services; | ||||||||||||||||||
|
||||||||||||||||||
const alertQuery = useMemo( | ||||||||||||||||||
() => ({ | ||||||||||||||||||
bool: { | ||||||||||||||||||
filter: [ | ||||||||||||||||||
{ | ||||||||||||||||||
term: { [SERVICE_NAME]: serviceName }, | ||||||||||||||||||
}, | ||||||||||||||||||
...(alertStatusFilter !== ALL_ALERTS_FILTER | ||||||||||||||||||
? [ | ||||||||||||||||||
{ | ||||||||||||||||||
term: { [ALERT_STATUS]: alertStatusFilter }, | ||||||||||||||||||
}, | ||||||||||||||||||
] | ||||||||||||||||||
: []), | ||||||||||||||||||
...environmentQuery(environment), | ||||||||||||||||||
], | ||||||||||||||||||
}, | ||||||||||||||||||
}), | ||||||||||||||||||
[serviceName, alertStatusFilter, environment] | ||||||||||||||||||
); | ||||||||||||||||||
const useToasts = () => notifications!.toasts; | ||||||||||||||||||
|
||||||||||||||||||
const apmQueries = useMemo(() => { | ||||||||||||||||||
const environmentKuery = getEnvironmentKuery(environment); | ||||||||||||||||||
let query = `${SERVICE_NAME}:${serviceName}`; | ||||||||||||||||||
|
||||||||||||||||||
const alertStateProps = { | ||||||||||||||||||
alertsTableConfigurationRegistry, | ||||||||||||||||||
id: 'service-overview-alerts', | ||||||||||||||||||
configurationId: AlertConsumers.OBSERVABILITY, | ||||||||||||||||||
featureIds: [AlertConsumers.APM], | ||||||||||||||||||
query: alertQuery, | ||||||||||||||||||
showExpandToDetails: false, | ||||||||||||||||||
}; | ||||||||||||||||||
if (environmentKuery) { | ||||||||||||||||||
query += ` AND ${environmentKuery}`; | ||||||||||||||||||
} | ||||||||||||||||||
return [ | ||||||||||||||||||
{ | ||||||||||||||||||
query, | ||||||||||||||||||
language: 'kuery', | ||||||||||||||||||
}, | ||||||||||||||||||
]; | ||||||||||||||||||
}, [serviceName, environment]); | ||||||||||||||||||
|
||||||||||||||||||
return ( | ||||||||||||||||||
<EuiPanel borderRadius="none" hasShadow={false}> | ||||||||||||||||||
<EuiFlexGroup direction="column" gutterSize="s"> | ||||||||||||||||||
<EuiFlexItem> | ||||||||||||||||||
<EuiFlexItem grow={false}> | ||||||||||||||||||
<AlertsTableStatusFilter | ||||||||||||||||||
<ObservabilityAlertSearchBar | ||||||||||||||||||
appName={'apmApp'} | ||||||||||||||||||
kuery={kuery} | ||||||||||||||||||
onRangeFromChange={(rangeFrom) => | ||||||||||||||||||
push(history, { | ||||||||||||||||||
query: { | ||||||||||||||||||
rangeFrom, | ||||||||||||||||||
}, | ||||||||||||||||||
}) | ||||||||||||||||||
} | ||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think this will be better to visualize. WDYT?
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. what do you mean "visualize" ? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I meant just to write it in a single line. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. updated here 1e899e0 |
||||||||||||||||||
onRangeToChange={(rangeTo) => | ||||||||||||||||||
push(history, { | ||||||||||||||||||
query: { | ||||||||||||||||||
rangeTo, | ||||||||||||||||||
}, | ||||||||||||||||||
}) | ||||||||||||||||||
} | ||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Can you do something like that? I haven't tested it and feel free to ignore it 😅
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. let me try it 😃 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ah, you'll probably do something like. Maybe not worth it.
|
||||||||||||||||||
onKueryChange={(kuery) => | ||||||||||||||||||
push(history, { | ||||||||||||||||||
query: { | ||||||||||||||||||
kuery, | ||||||||||||||||||
}, | ||||||||||||||||||
}) | ||||||||||||||||||
} | ||||||||||||||||||
defaultSearchQueries={apmQueries} | ||||||||||||||||||
onStatusChange={setAlertStatusFilter} | ||||||||||||||||||
onEsQueryChange={setEsQuery} | ||||||||||||||||||
rangeTo={rangeTo} | ||||||||||||||||||
rangeFrom={rangeFrom} | ||||||||||||||||||
status={alertStatusFilter} | ||||||||||||||||||
onChange={setAlertStatusFilter} | ||||||||||||||||||
services={{ timeFilterService, AlertsSearchBar, useToasts }} | ||||||||||||||||||
/> | ||||||||||||||||||
</EuiFlexItem> | ||||||||||||||||||
</EuiFlexItem> | ||||||||||||||||||
<EuiFlexItem> | ||||||||||||||||||
<AlertsStateTable {...alertStateProps} /> | ||||||||||||||||||
{esQuery && ( | ||||||||||||||||||
<AlertsStateTable | ||||||||||||||||||
alertsTableConfigurationRegistry={ | ||||||||||||||||||
alertsTableConfigurationRegistry | ||||||||||||||||||
} | ||||||||||||||||||
id={'service-overview-alerts'} | ||||||||||||||||||
configurationId={AlertConsumers.OBSERVABILITY} | ||||||||||||||||||
featureIds={[AlertConsumers.APM]} | ||||||||||||||||||
query={esQuery} | ||||||||||||||||||
showExpandToDetails={false} | ||||||||||||||||||
/> | ||||||||||||||||||
)} | ||||||||||||||||||
</EuiFlexItem> | ||||||||||||||||||
</EuiFlexGroup> | ||||||||||||||||||
</EuiPanel> | ||||||||||||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can't you use this function instead?
https://github.com/elastic/kibana/blob/main/x-pack/plugins/apm/common/environment_filter_values.ts#L46-L56
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I could use it like this:
so I thought it might be cleaner to have the function
getEnvironmentKuery
responsible for returning thekuery