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:
Pascal Hartig
2019-06-04 05:59:37 -07:00
committed by Facebook Github Bot
parent 62c112c713
commit 6e0121686c

View File

@@ -38,6 +38,7 @@ type PersistedState = {
images: ImagesList,
events: Array<ImageEventWithId>,
imagesMap: ImagesMap,
closeableReferenceLeaks: Array<AndroidCloseableReferenceLeakEvent>,
};
type PluginState = {
@@ -78,6 +79,7 @@ export default class extends FlipperPlugin<PluginState, *, PersistedState> {
events: [],
imagesMap: {},
surfaceList: new Set(),
closeableReferenceLeaks: [],
};
static exportPersistedState = (
@@ -98,10 +100,10 @@ export default class extends FlipperPlugin<PluginState, *, PersistedState> {
}
const {levels, events, imageDataList} = data;
let pluginData: PersistedState = {
...FlipperPlugin.defaultPersistedState,
images: [...levels.levels],
surfaceList: new Set(),
events: [],
imagesMap: {},
closeableReferenceLeaks:
(persistedState && persistedState.closeableReferenceLeaks) || [],
};
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 = (
persistedState: PersistedState,
): Promise<MetricType> => {
const {events, imagesMap} = persistedState;
let wastedBytes = events.reduce((acc, event) => {
const {events, imagesMap, closeableReferenceLeaks} = persistedState;
let wastedBytes = (events || []).reduce((acc, event) => {
const {viewport, imageIds} = event;
if (!viewport) {
return acc;
@@ -159,7 +179,10 @@ export default class extends FlipperPlugin<PluginState, *, PersistedState> {
}, acc)
);
}, 0);
return Promise.resolve({WASTED_BYTES: wastedBytes});
return Promise.resolve({
WASTED_BYTES: wastedBytes,
CLOSEABLE_REFERENCE_LEAKS: (closeableReferenceLeaks || []).length,
});
};
state: PluginState;
@@ -235,13 +258,6 @@ export default class extends FlipperPlugin<PluginState, *, PersistedState> {
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.props.setPersistedState({imagesMap: images}),
);