Add metrics for closeable reference leaks
Summary: Add a metric for the raw number of leaked closeable references. Reviewed By: priteshrnandgaonkar Differential Revision: D15603348 fbshipit-source-id: 03379e180b5822620e8e8347bef354edb3527d19
This commit is contained in:
committed by
Facebook Github Bot
parent
62c112c713
commit
6e0121686c
@@ -38,6 +38,7 @@ type PersistedState = {
|
|||||||
images: ImagesList,
|
images: ImagesList,
|
||||||
events: Array<ImageEventWithId>,
|
events: Array<ImageEventWithId>,
|
||||||
imagesMap: ImagesMap,
|
imagesMap: ImagesMap,
|
||||||
|
closeableReferenceLeaks: Array<AndroidCloseableReferenceLeakEvent>,
|
||||||
};
|
};
|
||||||
|
|
||||||
type PluginState = {
|
type PluginState = {
|
||||||
@@ -78,6 +79,7 @@ export default class extends FlipperPlugin<PluginState, *, PersistedState> {
|
|||||||
events: [],
|
events: [],
|
||||||
imagesMap: {},
|
imagesMap: {},
|
||||||
surfaceList: new Set(),
|
surfaceList: new Set(),
|
||||||
|
closeableReferenceLeaks: [],
|
||||||
};
|
};
|
||||||
|
|
||||||
static exportPersistedState = (
|
static exportPersistedState = (
|
||||||
@@ -98,10 +100,10 @@ export default class extends FlipperPlugin<PluginState, *, PersistedState> {
|
|||||||
}
|
}
|
||||||
const {levels, events, imageDataList} = data;
|
const {levels, events, imageDataList} = data;
|
||||||
let pluginData: PersistedState = {
|
let pluginData: PersistedState = {
|
||||||
|
...FlipperPlugin.defaultPersistedState,
|
||||||
images: [...levels.levels],
|
images: [...levels.levels],
|
||||||
surfaceList: new Set(),
|
closeableReferenceLeaks:
|
||||||
events: [],
|
(persistedState && persistedState.closeableReferenceLeaks) || [],
|
||||||
imagesMap: {},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
events.forEach((event: ImageEventWithId, index) => {
|
events.forEach((event: ImageEventWithId, index) => {
|
||||||
@@ -133,11 +135,29 @@ export default class extends FlipperPlugin<PluginState, *, PersistedState> {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static persistedStateReducer = (
|
||||||
|
persistedState: PersistedState,
|
||||||
|
method: string,
|
||||||
|
data: Object,
|
||||||
|
): PersistedState => {
|
||||||
|
if (method == 'closeable_reference_leak_event') {
|
||||||
|
const event: AndroidCloseableReferenceLeakEvent = data;
|
||||||
|
return {
|
||||||
|
...persistedState,
|
||||||
|
closeableReferenceLeaks: persistedState.closeableReferenceLeaks.concat(
|
||||||
|
event,
|
||||||
|
),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return persistedState;
|
||||||
|
};
|
||||||
|
|
||||||
static metricsReducer = (
|
static metricsReducer = (
|
||||||
persistedState: PersistedState,
|
persistedState: PersistedState,
|
||||||
): Promise<MetricType> => {
|
): Promise<MetricType> => {
|
||||||
const {events, imagesMap} = persistedState;
|
const {events, imagesMap, closeableReferenceLeaks} = persistedState;
|
||||||
let wastedBytes = events.reduce((acc, event) => {
|
let wastedBytes = (events || []).reduce((acc, event) => {
|
||||||
const {viewport, imageIds} = event;
|
const {viewport, imageIds} = event;
|
||||||
if (!viewport) {
|
if (!viewport) {
|
||||||
return acc;
|
return acc;
|
||||||
@@ -159,7 +179,10 @@ export default class extends FlipperPlugin<PluginState, *, PersistedState> {
|
|||||||
}, acc)
|
}, acc)
|
||||||
);
|
);
|
||||||
}, 0);
|
}, 0);
|
||||||
return Promise.resolve({WASTED_BYTES: wastedBytes});
|
return Promise.resolve({
|
||||||
|
WASTED_BYTES: wastedBytes,
|
||||||
|
CLOSEABLE_REFERENCE_LEAKS: (closeableReferenceLeaks || []).length,
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
state: PluginState;
|
state: PluginState;
|
||||||
@@ -235,13 +258,6 @@ export default class extends FlipperPlugin<PluginState, *, PersistedState> {
|
|||||||
this.setState({isDebugOverlayEnabled: event.enabled});
|
this.setState({isDebugOverlayEnabled: event.enabled});
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
this.client.subscribe(
|
|
||||||
'closeable_reference_leak_event',
|
|
||||||
(event: AndroidCloseableReferenceLeakEvent) => {
|
|
||||||
// TODO(T45065440): Temporary log, to be turned into counter.
|
|
||||||
console.warn('CloseableReference leak detected:', event);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
this.imagePool = new ImagePool(this.getImage, (images: ImagesMap) =>
|
this.imagePool = new ImagePool(this.getImage, (images: ImagesMap) =>
|
||||||
this.props.setPersistedState({imagesMap: images}),
|
this.props.setPersistedState({imagesMap: images}),
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user