From 90bbb972eaea8100b43aebae2d0ff1307f88ffd2 Mon Sep 17 00:00:00 2001 From: Elliot Hesp Date: Tue, 10 Jul 2018 20:11:07 +0100 Subject: [PATCH] [perf][android] Refactor with Trace/HttpMetric --- .../firebase/perf/RNFirebasePerformance.java | 149 +++++++++++++++++- bridge/android/build.gradle | 4 +- 2 files changed, 148 insertions(+), 5 deletions(-) diff --git a/android/src/main/java/io/invertase/firebase/perf/RNFirebasePerformance.java b/android/src/main/java/io/invertase/firebase/perf/RNFirebasePerformance.java index 81defc82..da7c071d 100644 --- a/android/src/main/java/io/invertase/firebase/perf/RNFirebasePerformance.java +++ b/android/src/main/java/io/invertase/firebase/perf/RNFirebasePerformance.java @@ -3,18 +3,24 @@ package io.invertase.firebase.perf; import android.util.Log; +import com.facebook.react.bridge.Arguments; +import com.facebook.react.bridge.Promise; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReactMethod; +import com.facebook.react.bridge.WritableMap; import com.google.firebase.perf.FirebasePerformance; import com.google.firebase.perf.metrics.Trace; +import com.google.firebase.perf.metrics.HttpMetric; import java.util.HashMap; +import java.util.Map; public class RNFirebasePerformance extends ReactContextBaseJavaModule { private static final String TAG = "RNFirebasePerformance"; private HashMap traces = new HashMap<>(); + private HashMap httpMetrics = new HashMap<>(); public RNFirebasePerformance(ReactApplicationContext reactContext) { super(reactContext); @@ -30,19 +36,73 @@ public class RNFirebasePerformance extends ReactContextBaseJavaModule { } @ReactMethod - public void setPerformanceCollectionEnabled(Boolean enabled) { + public void setPerformanceCollectionEnabled(Boolean enabled, Promise promise) { FirebasePerformance.getInstance().setPerformanceCollectionEnabled(enabled); + promise.resolve(null); + } + + /** + * Trace + */ + + @ReactMethod + public void getTraceAttribute(String identifier, String attribute, Promise promise) { + promise.resolve(getOrCreateTrace(identifier).getAttribute(attribute)); } @ReactMethod - public void start(String identifier) { + public void getTraceAttributes(String identifier, Promise promise) { + Map attributes = getOrCreateTrace(identifier).getAttributes(); + WritableMap map = Arguments.createMap(); + + for (Map.Entry entry : attributes.entrySet()) { + map.putString(entry.getKey(), entry.getValue()); + } + + promise.resolve(map); + } + + @ReactMethod + public void getTraceLongMetric(String identifier, String metricName, Promise promise) { + Integer value = Long.valueOf(getOrCreateTrace(identifier).getLongMetric(metricName)).intValue(); + promise.resolve(value); + } + + @ReactMethod + public void incrementTraceMetric(String identifier, String metricName, Integer incrementBy, Promise promise) { + getOrCreateTrace(identifier).incrementMetric(metricName, incrementBy.longValue()); + promise.resolve(null); + } + + @ReactMethod + public void putTraceAttribute(String identifier, String attribute, String value, Promise promise) { + getOrCreateTrace(identifier).putAttribute(attribute, value); + promise.resolve(null); + } + + @ReactMethod + public void putTraceMetric(String identifier, String metricName, Integer value, Promise promise) { + getOrCreateTrace(identifier).putMetric(metricName, value.longValue()); + promise.resolve(null); + } + + @ReactMethod + public void removeTraceAttribute(String identifier, String attribute, Promise promise) { + getOrCreateTrace(identifier).removeAttribute(attribute); + promise.resolve(null); + } + + @ReactMethod + public void startTrace(String identifier, Promise promise) { getOrCreateTrace(identifier).start(); + promise.resolve(null); } @ReactMethod - public void stop(String identifier) { + public void stopTrace(String identifier, Promise promise) { getOrCreateTrace(identifier).stop(); traces.remove(identifier); + promise.resolve(null); } @ReactMethod @@ -50,6 +110,79 @@ public class RNFirebasePerformance extends ReactContextBaseJavaModule { getOrCreateTrace(identifier).incrementCounter(event); } + /** + * Http Metric + */ + + @ReactMethod + public void getHttpMetricAttribute(String url, String httpMethod, String attribute, Promise promise) { + promise.resolve(getOrCreateHttpMetric(url, httpMethod).getAttribute(attribute)); + } + + @ReactMethod + public void getHttpMetricAttributes(String url, String httpMethod, Promise promise) { + Map attributes = getOrCreateHttpMetric(url, httpMethod).getAttributes(); + WritableMap map = Arguments.createMap(); + + for (Map.Entry entry : attributes.entrySet()) { + map.putString(entry.getKey(), entry.getValue()); + } + + promise.resolve(map); + } + + @ReactMethod + public void putHttpMetricAttribute(String url, String httpMethod, String attribute, String value, Promise promise) { + getOrCreateHttpMetric(url, httpMethod).putAttribute(attribute, value); + promise.resolve(null); + } + + @ReactMethod + public void removeHttpMetricAttribute(String url, String httpMethod, String attribute, Promise promise) { + getOrCreateHttpMetric(url, httpMethod).removeAttribute(attribute); + promise.resolve(null); + } + + @ReactMethod + public void setHttpMetricResponseCode(String url, String httpMethod, Integer code, Promise promise) { + getOrCreateHttpMetric(url, httpMethod).setHttpResponseCode(code); + promise.resolve(null); + } + + @ReactMethod + public void setHttpMetricRequestPayloadSize(String url, String httpMethod, Integer bytes, Promise promise) { + getOrCreateHttpMetric(url, httpMethod).setRequestPayloadSize(bytes.longValue()); + promise.resolve(null); + } + + @ReactMethod + public void setHttpMetricResponseContentType(String url, String httpMethod, String type, Promise promise) { + getOrCreateHttpMetric(url, httpMethod).setResponseContentType(type); + promise.resolve(null); + } + + @ReactMethod + public void setHttpMetricResponsePayloadSize(String url, String httpMethod, Integer bytes, Promise promise) { + getOrCreateHttpMetric(url, httpMethod).setResponsePayloadSize(bytes.longValue()); + promise.resolve(null); + } + + @ReactMethod + public void startHttpMetric(String url, String httpMethod, Promise promise) { + getOrCreateHttpMetric(url, httpMethod).start(); + promise.resolve(null); + } + + @ReactMethod + public void stopHttpMetric(String url, String httpMethod, Promise promise) { + getOrCreateHttpMetric(url, httpMethod).stop(); + promise.resolve(null); + } + + /** + * Private + */ + private Trace getOrCreateTrace(String identifier) { if (traces.containsKey(identifier)) { return traces.get(identifier); @@ -58,4 +191,14 @@ public class RNFirebasePerformance extends ReactContextBaseJavaModule { traces.put(identifier, trace); return trace; } + + private HttpMetric getOrCreateHttpMetric(String url, String httpMethod) { + String identifier = url + httpMethod; + if (httpMetrics.containsKey(identifier)) { + return httpMetrics.get(identifier); + } + HttpMetric httpMetric = FirebasePerformance.getInstance().newHttpMetric(url, httpMethod); + httpMetrics.put(identifier, httpMetric); + return httpMetric; + } } diff --git a/bridge/android/build.gradle b/bridge/android/build.gradle index 8e7ee8c7..f1936428 100755 --- a/bridge/android/build.gradle +++ b/bridge/android/build.gradle @@ -7,9 +7,9 @@ buildscript { } } dependencies { - classpath 'com.android.tools.build:gradle:3.1.2' + classpath 'com.android.tools.build:gradle:3.1.3' classpath 'com.google.gms:google-services:4.0.1' - classpath 'com.google.firebase:firebase-plugins:1.1.1' + classpath 'com.google.firebase:firebase-plugins:1.1.5' classpath 'io.fabric.tools:gradle:1.25.4' } }