Skip to content

Commit ab67ac3

Browse files
dgieselaarkibanamachine
authored andcommitted
[Observability] Split up observability-utils package (elastic#199801)
Split up observability-utils package in browser, common, server. Also made a small change to `withSpan` to automatically log operation times when the debug level for the logger is enabled. --------- Co-authored-by: kibanamachine <[email protected]>
1 parent 5386864 commit ab67ac3

File tree

88 files changed

+1224
-98
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

88 files changed

+1224
-98
lines changed

.github/CODEOWNERS

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -831,7 +831,9 @@ x-pack/packages/observability/alerting_rule_utils @elastic/obs-ux-management-tea
831831
x-pack/packages/observability/alerting_test_data @elastic/obs-ux-management-team
832832
x-pack/packages/observability/get_padded_alert_time_range_util @elastic/obs-ux-management-team
833833
x-pack/packages/observability/logs_overview @elastic/obs-ux-logs-team
834-
x-pack/packages/observability/observability_utils @elastic/observability-ui
834+
x-pack/packages/observability/observability_utils/observability_utils_browser @elastic/observability-ui
835+
x-pack/packages/observability/observability_utils/observability_utils_common @elastic/observability-ui
836+
x-pack/packages/observability/observability_utils/observability_utils_server @elastic/observability-ui
835837
x-pack/packages/observability/synthetics_test_data @elastic/obs-ux-management-team
836838
x-pack/packages/rollup @elastic/kibana-management
837839
x-pack/packages/search/shared_ui @elastic/search-kibana

package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -702,7 +702,9 @@
702702
"@kbn/observability-plugin": "link:x-pack/plugins/observability_solution/observability",
703703
"@kbn/observability-shared-plugin": "link:x-pack/plugins/observability_solution/observability_shared",
704704
"@kbn/observability-synthetics-test-data": "link:x-pack/packages/observability/synthetics_test_data",
705-
"@kbn/observability-utils": "link:x-pack/packages/observability/observability_utils",
705+
"@kbn/observability-utils-browser": "link:x-pack/packages/observability/observability_utils/observability_utils_browser",
706+
"@kbn/observability-utils-common": "link:x-pack/packages/observability/observability_utils/observability_utils_common",
707+
"@kbn/observability-utils-server": "link:x-pack/packages/observability/observability_utils/observability_utils_server",
706708
"@kbn/oidc-provider-plugin": "link:x-pack/test/security_api_integration/plugins/oidc_provider",
707709
"@kbn/open-telemetry-instrumented-plugin": "link:test/common/plugins/otel_metrics",
708710
"@kbn/openapi-common": "link:packages/kbn-openapi-common",

packages/kbn-apm-utils/index.ts

Lines changed: 40 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* License v3.0 only", or the "Server Side Public License, v 1".
88
*/
99

10-
import agent from 'elastic-apm-node';
10+
import agent, { Logger } from 'elastic-apm-node';
1111
import asyncHooks from 'async_hooks';
1212

1313
export interface SpanOptions {
@@ -34,14 +34,48 @@ const runInNewContext = <T extends (...args: any[]) => any>(cb: T): ReturnType<T
3434

3535
export async function withSpan<T>(
3636
optionsOrName: SpanOptions | string,
37-
cb: (span?: Span) => Promise<T>
37+
cb: (span?: Span) => Promise<T>,
38+
logger?: Logger
3839
): Promise<T> {
3940
const options = parseSpanOptions(optionsOrName);
4041

4142
const { name, type, subtype, labels, intercept } = options;
4243

44+
let time: number | undefined;
45+
if (logger?.isLevelEnabled('debug')) {
46+
time = performance.now();
47+
}
48+
49+
function logTook(failed: boolean) {
50+
if (time) {
51+
logger?.debug(
52+
() =>
53+
`Operation ${name}${failed ? ` (failed)` : ''} ${
54+
Math.round(performance.now() - time!) / 1000
55+
}s`
56+
);
57+
}
58+
}
59+
60+
const withLogTook = [
61+
<TR>(res: TR): TR | Promise<TR> => {
62+
logTook(false);
63+
return res;
64+
},
65+
(err: any): never => {
66+
logTook(true);
67+
throw err;
68+
},
69+
];
70+
4371
if (!agent.isStarted()) {
44-
return cb();
72+
const promise = cb();
73+
// make sure tests that mock out the callback with a sync
74+
// function don't fail.
75+
if (typeof promise === 'object' && 'then' in promise) {
76+
return promise.then(...withLogTook);
77+
}
78+
return promise;
4579
}
4680

4781
let createdSpan: Span | undefined;
@@ -57,7 +91,7 @@ export async function withSpan<T>(
5791
createdSpan = agent.startSpan(name) ?? undefined;
5892

5993
if (!createdSpan) {
60-
return cb();
94+
return cb().then(...withLogTook);
6195
}
6296
}
6397

@@ -76,7 +110,7 @@ export async function withSpan<T>(
76110
}
77111

78112
if (!span) {
79-
return promise;
113+
return promise.then(...withLogTook);
80114
}
81115

82116
const targetedSpan = span;
@@ -98,6 +132,7 @@ export async function withSpan<T>(
98132
}
99133

100134
return promise
135+
.then(...withLogTook)
101136
.then((res) => {
102137
if (!targetedSpan.outcome || targetedSpan.outcome === 'unknown') {
103138
targetedSpan.outcome = 'success';

tsconfig.base.json

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1330,8 +1330,12 @@
13301330
"@kbn/observability-shared-plugin/*": ["x-pack/plugins/observability_solution/observability_shared/*"],
13311331
"@kbn/observability-synthetics-test-data": ["x-pack/packages/observability/synthetics_test_data"],
13321332
"@kbn/observability-synthetics-test-data/*": ["x-pack/packages/observability/synthetics_test_data/*"],
1333-
"@kbn/observability-utils": ["x-pack/packages/observability/observability_utils"],
1334-
"@kbn/observability-utils/*": ["x-pack/packages/observability/observability_utils/*"],
1333+
"@kbn/observability-utils-browser": ["x-pack/packages/observability/observability_utils/observability_utils_browser"],
1334+
"@kbn/observability-utils-browser/*": ["x-pack/packages/observability/observability_utils/observability_utils_browser/*"],
1335+
"@kbn/observability-utils-common": ["x-pack/packages/observability/observability_utils/observability_utils_common"],
1336+
"@kbn/observability-utils-common/*": ["x-pack/packages/observability/observability_utils/observability_utils_common/*"],
1337+
"@kbn/observability-utils-server": ["x-pack/packages/observability/observability_utils/observability_utils_server"],
1338+
"@kbn/observability-utils-server/*": ["x-pack/packages/observability/observability_utils/observability_utils_server/*"],
13351339
"@kbn/oidc-provider-plugin": ["x-pack/test/security_api_integration/plugins/oidc_provider"],
13361340
"@kbn/oidc-provider-plugin/*": ["x-pack/test/security_api_integration/plugins/oidc_provider/*"],
13371341
"@kbn/open-telemetry-instrumented-plugin": ["test/common/plugins/otel_metrics"],

x-pack/packages/ai-infra/inference-common/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,3 +81,5 @@ export {
8181
isInferenceInternalError,
8282
isInferenceRequestError,
8383
} from './src/errors';
84+
85+
export { truncateList } from './src/truncate_list';

x-pack/packages/observability/observability_utils/README.md

Lines changed: 0 additions & 5 deletions
This file was deleted.

x-pack/packages/observability/observability_utils/hooks/use_abort_controller.ts renamed to x-pack/packages/observability/observability_utils/observability_utils_browser/hooks/use_abort_controller.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ export function useAbortController() {
1818

1919
return {
2020
signal: controller.signal,
21+
abort: () => {
22+
controller.abort();
23+
},
2124
refresh: () => {
2225
setController(() => new AbortController());
2326
},

x-pack/packages/observability/observability_utils/hooks/use_abortable_async.ts renamed to x-pack/packages/observability/observability_utils/observability_utils_browser/hooks/use_abortable_async.ts

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,32 @@ export type AbortableAsyncState<T> = (T extends Promise<infer TReturn>
1717
? State<TReturn>
1818
: State<T>) & { refresh: () => void };
1919

20+
export type AbortableAsyncStateOf<T extends AbortableAsyncState<any>> =
21+
T extends AbortableAsyncState<infer TResponse> ? Awaited<TResponse> : never;
22+
23+
interface UseAbortableAsyncOptions<T> {
24+
clearValueOnNext?: boolean;
25+
unsetValueOnError?: boolean;
26+
defaultValue?: () => T;
27+
onError?: (error: Error) => void;
28+
}
29+
30+
export type UseAbortableAsync<
31+
TAdditionalParameters extends Record<string, any> = {},
32+
TAdditionalOptions extends Record<string, any> = {}
33+
> = <T>(
34+
fn: ({}: { signal: AbortSignal } & TAdditionalParameters) => T | Promise<T>,
35+
deps: any[],
36+
options?: UseAbortableAsyncOptions<T> & TAdditionalOptions
37+
) => AbortableAsyncState<T>;
38+
2039
export function useAbortableAsync<T>(
2140
fn: ({}: { signal: AbortSignal }) => T | Promise<T>,
2241
deps: any[],
23-
options?: { clearValueOnNext?: boolean; defaultValue?: () => T }
42+
options?: UseAbortableAsyncOptions<T>
2443
): AbortableAsyncState<T> {
2544
const clearValueOnNext = options?.clearValueOnNext;
45+
const unsetValueOnError = options?.unsetValueOnError;
2646

2747
const controllerRef = useRef(new AbortController());
2848

@@ -43,6 +63,15 @@ export function useAbortableAsync<T>(
4363
setError(undefined);
4464
}
4565

66+
function handleError(err: Error) {
67+
setError(err);
68+
if (unsetValueOnError) {
69+
setValue(undefined);
70+
}
71+
setLoading(false);
72+
options?.onError?.(err);
73+
}
74+
4675
try {
4776
const response = fn({ signal: controller.signal });
4877
if (isPromise(response)) {
@@ -52,22 +81,15 @@ export function useAbortableAsync<T>(
5281
setError(undefined);
5382
setValue(nextValue);
5483
})
55-
.catch((err) => {
56-
setValue(undefined);
57-
if (!controller.signal.aborted) {
58-
setError(err);
59-
}
60-
})
84+
.catch(handleError)
6185
.finally(() => setLoading(false));
6286
} else {
6387
setError(undefined);
6488
setValue(response);
6589
setLoading(false);
6690
}
6791
} catch (err) {
68-
setValue(undefined);
69-
setError(err);
70-
setLoading(false);
92+
handleError(err);
7193
}
7294

7395
return () => {

0 commit comments

Comments
 (0)