[
https://issues.apache.org/jira/browse/WEEX-545?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16574215#comment-16574215
]
ASF GitHub Bot commented on WEEX-545:
-------------------------------------
YorkShen closed pull request #1387: [WEEX-545] [Android] apm for weex
perofrmance
URL: https://github.com/apache/incubator-weex/pull/1387
This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:
As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):
diff --git
a/android/commons/src/main/java/com/alibaba/weex/commons/adapter/ImageAdapter.java
b/android/commons/src/main/java/com/alibaba/weex/commons/adapter/ImageAdapter.java
index c6f2e64804..77dc4fcbb6 100644
---
a/android/commons/src/main/java/com/alibaba/weex/commons/adapter/ImageAdapter.java
+++
b/android/commons/src/main/java/com/alibaba/weex/commons/adapter/ImageAdapter.java
@@ -26,10 +26,12 @@
import com.squareup.picasso.Callback;
import com.squareup.picasso.Picasso;
import com.taobao.weex.WXEnvironment;
+import com.taobao.weex.WXSDKInstance;
import com.taobao.weex.WXSDKManager;
import com.taobao.weex.adapter.IWXImgLoaderAdapter;
import com.taobao.weex.common.WXImageStrategy;
import com.taobao.weex.dom.WXImageQuality;
+import com.taobao.weex.ui.IFComponentHolder;
public class ImageAdapter implements IWXImgLoaderAdapter {
@@ -50,6 +52,10 @@ public void run() {
view.setImageBitmap(null);
return;
}
+ if (null != strategy){
+ recordImgLoadAction(strategy.instanceId);
+ }
+
String temp = url;
if (url.startsWith("//")) {
temp = "http:" + url;
@@ -72,6 +78,7 @@ public void onSuccess() {
if(strategy.getImageListener()!=null){
strategy.getImageListener().onImageFinish(url,view,true,null);
}
+ recordImgLoadResult(strategy.instanceId,true,null);
if(!TextUtils.isEmpty(strategy.placeHolder)){
((Picasso)
view.getTag(strategy.placeHolder.hashCode())).cancelRequest(view);
@@ -83,6 +90,7 @@ public void onError() {
if(strategy.getImageListener()!=null){
strategy.getImageListener().onImageFinish(url,view,false,null);
}
+ recordImgLoadResult(strategy.instanceId,false,null);
}
});
}
@@ -93,4 +101,19 @@ public void onError() {
WXSDKManager.getInstance().postOnUiThread(runnable, 0);
}
}
+ private void recordImgLoadAction(String instanceId){
+ WXSDKInstance instance =
WXSDKManager.getInstance().getAllInstanceMap().get(instanceId);
+ if (null == instance || instance.isDestroy()){
+ return;
+ }
+ instance.getApmForInstance().actionLoadImg();
+ }
+
+ private void recordImgLoadResult(String instanceId,boolean succeed,String
errorCode){
+ WXSDKInstance instance =
WXSDKManager.getInstance().getAllInstanceMap().get(instanceId);
+ if (null == instance || instance.isDestroy()){
+ return;
+ }
+ instance.getApmForInstance().actionLoadImgResult(succeed,errorCode);
+ }
}
diff --git
a/android/playground/app/src/main/java/com/alibaba/weex/WXApplication.java
b/android/playground/app/src/main/java/com/alibaba/weex/WXApplication.java
index 35fd36a0bd..48d59f4e37 100644
--- a/android/playground/app/src/main/java/com/alibaba/weex/WXApplication.java
+++ b/android/playground/app/src/main/java/com/alibaba/weex/WXApplication.java
@@ -25,6 +25,7 @@
import com.alibaba.weex.commons.adapter.DefaultWebSocketAdapterFactory;
import com.alibaba.weex.commons.adapter.ImageAdapter;
import com.alibaba.weex.commons.adapter.JSExceptionAdapter;
+import com.alibaba.weex.extend.adapter.ApmGenerator;
import com.alibaba.weex.extend.adapter.DefaultAccessibilityRoleAdapter;
import com.alibaba.weex.extend.adapter.InterceptWXHttpAdapter;
import com.alibaba.weex.extend.component.RichText;
@@ -74,6 +75,7 @@ public void onCreate() {
.setWebSocketAdapterFactory(new
DefaultWebSocketAdapterFactory())
.setJSExceptionAdapter(new JSExceptionAdapter())
.setHttpAdapter(new InterceptWXHttpAdapter())
+ .setApmGenerater(new ApmGenerator())
.build()
);
diff --git
a/android/playground/app/src/main/java/com/alibaba/weex/extend/adapter/ApmGenerator.java
b/android/playground/app/src/main/java/com/alibaba/weex/extend/adapter/ApmGenerator.java
new file mode 100644
index 0000000000..d5b6774c29
--- /dev/null
+++
b/android/playground/app/src/main/java/com/alibaba/weex/extend/adapter/ApmGenerator.java
@@ -0,0 +1,33 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.alibaba.weex.extend.adapter;
+
+import com.taobao.weex.performance.IApmGenerator;
+import com.taobao.weex.performance.IWXApmMonitorAdapter;
+
+/**
+ * @author zhongcang
+ * @date 2018/7/13
+ */
+public class ApmGenerator implements IApmGenerator {
+ @Override
+ public IWXApmMonitorAdapter generateApmInstance(String type) {
+ return new WXInstanceApmAdapter();
+ }
+}
diff --git
a/android/playground/app/src/main/java/com/alibaba/weex/extend/adapter/WXInstanceApmAdapter.java
b/android/playground/app/src/main/java/com/alibaba/weex/extend/adapter/WXInstanceApmAdapter.java
new file mode 100644
index 0000000000..93785db927
--- /dev/null
+++
b/android/playground/app/src/main/java/com/alibaba/weex/extend/adapter/WXInstanceApmAdapter.java
@@ -0,0 +1,162 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.alibaba.weex.extend.adapter;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import android.util.Log;
+import com.taobao.weex.performance.IWXApmMonitorAdapter;
+import com.taobao.weex.performance.WXInstanceApm;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+public class WXInstanceApmAdapter implements IWXApmMonitorAdapter {
+ private final APMInfo mInstanceInfo;
+ private final Map<String, APMInfo> mSubProcedureInfo;
+ private boolean isAppear = true;
+
+ WXInstanceApmAdapter() {
+ mInstanceInfo = new APMInfo(WXInstanceApm.WEEX_PAGE_TOPIC);
+ mSubProcedureInfo = new HashMap<>(1);
+ }
+
+ @Override
+ public void onStart(String instanceId) {
+ }
+
+ @Override
+ public void onEnd() {
+ printVale();
+ }
+
+ @Override
+ public void onEvent(String name, Object value) {
+ if (!isAppear){
+ return;
+ }
+ mInstanceInfo.eventMap.put(name, value);
+ }
+
+ @Override
+ public void onStage(String name, long timestamp) {
+ mInstanceInfo.stageMap.put(name, timestamp);
+ }
+
+ @Override
+ public void addProperty(String key, Object value) {
+ mInstanceInfo.propertyMap.put(key, value);
+ }
+
+ @Override
+ public void addStats(String key, double value) {
+ mInstanceInfo.statsMap.put(key, value);
+ }
+
+ @Override
+ public void onSubProcedureStage(String procedureName, String stageName) {
+ getAndCheckAndSubProcedureMap(procedureName).stageMap.put(stageName,
System.currentTimeMillis());
+ }
+
+ @Override
+ public void onSubProcedureEvent(String procedureName, String eventName) {
+ getAndCheckAndSubProcedureMap(procedureName).eventMap.put(eventName,
System.currentTimeMillis());
+ }
+
+ @Override
+ public void setSubProcedureStats(String procedureName, String name, double
value) {
+ getAndCheckAndSubProcedureMap(procedureName).statsMap.put(name, value);
+ }
+
+ @Override
+ public void setSubProcedureProperties(String procedureName, String name,
Object value) {
+ getAndCheckAndSubProcedureMap(procedureName).propertyMap.put(name,
value);
+ }
+
+ @Override
+ public void onAppear() {
+ isAppear = true;
+ }
+
+ @Override
+ public void onDisappear() {
+ isAppear = false;
+ }
+
+ private APMInfo getAndCheckAndSubProcedureMap(String procedureName) {
+ APMInfo info = mSubProcedureInfo.get(procedureName);
+ if (null != info) {
+ return info;
+ }
+ synchronized (mSubProcedureInfo) {
+ info = new APMInfo(procedureName);
+ mSubProcedureInfo.put(procedureName, info);
+ }
+ return info;
+ }
+
+ private void printVale() {
+ String val = "";
+ try {
+ JSONObject subProcedureJson = new JSONObject();
+ for (Map.Entry<String, APMInfo> entry :
mSubProcedureInfo.entrySet()) {
+ subProcedureJson.put(entry.getKey(),
entry.getValue().toJson());
+ }
+ val = mInstanceInfo.toJson()
+ .put("subProcedures", subProcedureJson)
+ .toString();
+ } catch (JSONException e) {
+ e.printStackTrace();
+ }
+ Log.i("wxApmInstance", val);
+ //WXLogUtils.d("wxApmInstance", val);
+ }
+
+ private class APMInfo {
+ private String infoName;
+ private Map<String, Object> stageMap;
+ private Map<String, Object> propertyMap;
+ private Map<String, Object> eventMap;
+ private Map<String, Object> statsMap;
+
+ APMInfo(String name) {
+ this.infoName = name;
+ stageMap = new HashMap<>();
+ propertyMap = new HashMap<>();
+ eventMap = new HashMap<>();
+ statsMap = new HashMap<>();
+ }
+
+ JSONObject toJson() throws JSONException {
+ return new JSONObject()
+ .put("stage", convertMapToJSON(stageMap))
+ .put("property", convertMapToJSON(propertyMap))
+ .put("event", convertMapToJSON(eventMap))
+ .put("stats", convertMapToJSON(statsMap));
+ }
+
+ private JSONObject convertMapToJSON(Map<String, Object> params) throws
JSONException {
+ JSONObject json = new JSONObject();
+ for (Map.Entry<String, Object> entry : params.entrySet()) {
+ json.put(entry.getKey(), entry.getValue());
+ }
+ return json;
+ }
+ }
+}
diff --git a/android/sdk/src/main/java/com/taobao/weex/InitConfig.java
b/android/sdk/src/main/java/com/taobao/weex/InitConfig.java
index 9ff1377ce2..30f907d711 100644
--- a/android/sdk/src/main/java/com/taobao/weex/InitConfig.java
+++ b/android/sdk/src/main/java/com/taobao/weex/InitConfig.java
@@ -6,9 +6,9 @@
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -28,6 +28,7 @@
import com.taobao.weex.adapter.URIAdapter;
import com.taobao.weex.appfram.storage.IWXStorageAdapter;
import com.taobao.weex.appfram.websocket.IWebSocketAdapterFactory;
+import com.taobao.weex.performance.IApmGenerator;
/**
* Created by sospartan on 5/31/16.
@@ -44,6 +45,7 @@
private IWXJSExceptionAdapter mJSExceptionAdapter;
private String framework;
private ClassLoaderAdapter classLoaderAdapter;
+ private IApmGenerator apmGenerater;
public IWXHttpAdapter getHttpAdapter() {
return httpAdapter;
@@ -85,6 +87,10 @@ public ClassLoaderAdapter getClassLoaderAdapter() {
return classLoaderAdapter;
}
+ public IApmGenerator getApmGenerater() {
+ return apmGenerater;
+ }
+
public InitConfig setClassLoaderAdapter(ClassLoaderAdapter
classLoaderAdapter) {
this.classLoaderAdapter = classLoaderAdapter;
return this;
@@ -109,6 +115,7 @@ private InitConfig() {
String framework;
IWebSocketAdapterFactory webSocketAdapterFactory;
ClassLoaderAdapter classLoaderAdapter;
+ IApmGenerator apmGenerater;
public Builder(){
@@ -169,6 +176,11 @@ public Builder setClassLoaderAdapter(ClassLoaderAdapter
classLoaderAdapter) {
return this;
}
+ public Builder setApmGenerater(IApmGenerator apmGenerater){
+ this.apmGenerater =apmGenerater;
+ return this;
+ }
+
public InitConfig build(){
InitConfig config = new InitConfig();
config.httpAdapter = this.httpAdapter;
@@ -182,6 +194,7 @@ public InitConfig build(){
config.webSocketAdapterFactory = this.webSocketAdapterFactory;
config.mJSExceptionAdapter=this.mJSExceptionAdapter;
config.classLoaderAdapter = this.classLoaderAdapter;
+ config.apmGenerater = this.apmGenerater;
return config;
}
}
diff --git a/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
b/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
index f7b61cfe43..01baca01b8 100644
--- a/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
@@ -66,6 +66,7 @@
import com.taobao.weex.http.WXHttpUtil;
import com.taobao.weex.layout.ContentBoxMeasurement;
import com.taobao.weex.performance.WXAnalyzerDataTransfer;
+import com.taobao.weex.performance.WXInstanceApm;
import com.taobao.weex.tracing.WXTracing;
import com.taobao.weex.ui.action.GraphicActionAddElement;
import com.taobao.weex.ui.component.NestedContainer;
@@ -132,6 +133,7 @@
private boolean mNeedValidate = false;
private boolean mNeedReLoad = false;
private int mInstanceViewPortWidth = 750;
+ private WXInstanceApm mApmForInstance;
private @NonNull
FlatGUIContext mFlatGUIContext =new FlatGUIContext();
@@ -144,6 +146,8 @@
public long mRenderStartNanos;
public int mExecJSTraceId = WXTracing.nextId();
+ private boolean isViewDisAppear = false;
+
/**
*for network tracker
*/
@@ -392,6 +396,7 @@ public void init(Context context) {
mNativeInvokeHelper = new NativeInvokeHelper(mInstanceId);
mWXPerformance = new WXPerformance(mInstanceId);
+ mApmForInstance = new WXInstanceApm(mInstanceId);
mWXPerformance.WXSDKVersion = WXEnvironment.WXSDK_VERSION;
mWXPerformance.JSLibInitTime = WXEnvironment.sJSLibInitTime;
@@ -399,11 +404,11 @@ public void init(Context context) {
WXSDKManager.getInstance().getAllInstanceMap().put(mInstanceId,this);
- mContainerInfo.put(Dimension.activity.toString(), context instanceof
Activity
+ mContainerInfo.put(WXInstanceApm.KEY_PAGE_PROPERTIES_CONTAINER_NAME,
context instanceof Activity
? context.getClass().getSimpleName()
:"unKnowContainer"
);
- mContainerInfo.put(Dimension.instanceType.toString(),"page");
+ mContainerInfo.put(WXInstanceApm.KEY_PAGE_PROPERTIES_INSTANCE_TYPE,"page");
}
/**
@@ -566,6 +571,8 @@ private void renderInternal(String pageName,
if (mRendered || TextUtils.isEmpty(template)) {
return;
}
+
+
mApmForInstance.onStage(WXInstanceApm.KEY_PAGE_STAGES_RENDER_ORGIGIN,System.currentTimeMillis());
mWXPerformance.pageName = (TextUtils.isEmpty(pageName) ?
"defaultBundleUrl":pageName);
if (TextUtils.isEmpty(mBundleUrl)) {
@@ -598,6 +605,7 @@ private void renderInternal(String pageName,
}
mWXPerformance.JSTemplateSize = template.length() / 1024f;
+
mApmForInstance.addStats(WXInstanceApm.KEY_PAGE_STATS_BUNDLE_SIZE,mWXPerformance.JSTemplateSize);
mRenderStartTime = System.currentTimeMillis();
mRenderStrategy = flag;
@@ -629,9 +637,14 @@ private void renderByUrlInternal(String pageName,
renderOptions.put(BUNDLE_URL, url);
}
+ mApmForInstance.onStart();
+
Uri uri = Uri.parse(url);
if (uri != null && TextUtils.equals(uri.getScheme(), "file")) {
- render(pageName, WXFileUtils.loadFileOrAsset(assembleFilePath(uri),
mContext), renderOptions, jsonInitData, flag);
+
mApmForInstance.onStage(WXInstanceApm.KEY_PAGE_STAGES_DOWN_BUNDLE_START,System.currentTimeMillis());
+ String template = WXFileUtils.loadFileOrAsset(assembleFilePath(uri),
mContext);
+
mApmForInstance.onStage(WXInstanceApm.KEY_PAGE_STAGES_DOWN_BUNDLE_END,System.currentTimeMillis());
+ render(pageName,template , renderOptions, jsonInitData, flag);
return;
}
@@ -1098,6 +1111,8 @@ public void onRequestPermissionsResult(int requestCode,
String[] permissions, in
********************************************************/
public void onViewDisappear(){
+ isViewDisAppear = false;
+ mApmForInstance.onDisAppear();
WXComponent comp = getRootComponent();
if(comp != null) {
fireEvent(comp.getRef(), Constants.Event.VIEWDISAPPEAR, null, null);
@@ -1108,7 +1123,13 @@ public void onViewDisappear(){
}
}
+ public boolean isViewDisAppear(){
+ return isViewDisAppear;
+ }
+
public void onViewAppear(){
+ isViewDisAppear = true;
+ mApmForInstance.onAppear();
WXComponent comp = getRootComponent();
if(comp != null) {
fireEvent( comp.getRef(), Constants.Event.VIEWAPPEAR,null, null);
@@ -1247,6 +1268,7 @@ public void onChangeElement(WXComponent component,
boolean isOutOfScreen) {
// WXLogUtils.renderPerformanceLog(" interactionViewAddCount",
getWXPerformance().interactionViewAddCount);
// WXLogUtils.renderPerformanceLog(" interactionViewAddLimitCount",
getWXPerformance().interactionViewAddLimitCount);
// WXLogUtils.renderPerformanceLog(" interactionTime",
getWXPerformance().interactionTime);
+
mApmForInstance.arriveInteraction(getWXPerformance().interactionViewAddLimitCount,getWXPerformance().interactionViewAddCount);
}
}
@@ -1332,6 +1354,10 @@ public void firstScreenRenderFinished() {
if (mEnd)
return;
+ mEnd = true;
+
+ mApmForInstance.arriveFSRenderTime();
+
if (mStatisticsListener != null && mContext != null) {
runOnUiThread(new Runnable() {
@Override
@@ -1384,6 +1410,7 @@ private void destroyView(View rootView) {
public synchronized void destroy() {
if(!isDestroy()) {
+ mApmForInstance.onEnd();
if(mRendered) {
WXSDKManager.getInstance().destroyInstance(mInstanceId);
}
@@ -1594,6 +1621,7 @@ public void fireEvent(String elementRef,final String
type, final Map<String, Obj
if (null != mWXPerformance &&
mWXPerformance.fsCallEventTotalNum<Integer.MAX_VALUE){
mWXPerformance.fsCallEventTotalNum++;
}
+
mApmForInstance.updateFSDiffStats(WXInstanceApm.KEY_PAGE_STATS_FS_CALL_EVENT_NUM,1);
WXBridgeManager.getInstance().fireEventOnNode(getInstanceId(),elementRef,type,data,domChanges,
eventArgs, callback);
}
/**
@@ -1692,6 +1720,10 @@ public WXPerformance getWXPerformance(){
return mWXPerformance;
}
+ public WXInstanceApm getApmForInstance() {
+ return mApmForInstance;
+ }
+
public Map<String, Serializable> getUserTrackParams() {
return mUserTrackParams;
}
@@ -1721,9 +1753,11 @@ public int getMaxDeepLayer() {
public void setMaxDeepLayer(int maxDeepLayer) {
mMaxDeepLayer = maxDeepLayer;
+
mApmForInstance.updateMaxStats(WXInstanceApm.KEY_PAGE_STATS_MAX_DEEP_VIEW,maxDeepLayer);
}
public void setMaxDomDeep(int maxDomDeep){
+
mApmForInstance.updateMaxStats(WXInstanceApm.KEY_PAGE_STATS_MAX_DEEP_DOM,maxDomDeep);
if (null == mWXPerformance){
return;
}
@@ -1779,6 +1813,7 @@ public void onHttpStart() {
&& this.instance.getWXStatisticsListener() != null) {
this.instance.getWXStatisticsListener().onHttpStart();
}
+
mApmForInstance.onStage(WXInstanceApm.KEY_PAGE_STAGES_DOWN_BUNDLE_START,System.currentTimeMillis());
}
@Override
@@ -1807,6 +1842,8 @@ public void onHttpResponseProgress(int loadedLength) {
@Override
public void onHttpFinish(WXResponse response) {
+
mApmForInstance.onStage(WXInstanceApm.KEY_PAGE_STAGES_DOWN_BUNDLE_END,System.currentTimeMillis());
+
if (this.instance != null
&& this.instance.getWXStatisticsListener() != null) {
this.instance.getWXStatisticsListener().onHttpFinish();
@@ -1825,7 +1862,8 @@ public void onHttpFinish(WXResponse response) {
}
mWXPerformance.networkTime = System.currentTimeMillis() -
startRequestTime;
- if(response.extendParams!=null){
+ if(null!= response && response.extendParams!=null){
+ mApmForInstance.updateExtInfo(response.extendParams);
Object
actualNetworkTime=response.extendParams.get("actualNetworkTime");
mWXPerformance.actualNetworkTime=actualNetworkTime instanceof
Long?(long)actualNetworkTime:0;
WXLogUtils.renderPerformanceLog("actualNetworkTime",
mWXPerformance.actualNetworkTime);
@@ -1883,6 +1921,7 @@ public void onHttpFinish(WXResponse response) {
}
}
WXLogUtils.renderPerformanceLog("networkTime",
mWXPerformance.networkTime);
+ String wxErrorCode = WXInstanceApm.VALUE_ERROR_CODE_DEFAULT;
if (response!=null && response.originalData!=null &&
TextUtils.equals("200", response.statusCode)) {
String template = new String(response.originalData);
render(pageName, template, options, jsonInitData, flag);
@@ -1891,7 +1930,8 @@ public void onHttpFinish(WXResponse response) {
} else if
(TextUtils.equals(WXErrorCode.WX_DEGRAD_ERR_BUNDLE_CONTENTTYPE_ERROR.getErrorCode(),
response.statusCode)) {
WXLogUtils.e("user intercept: WX_DEGRAD_ERR_BUNDLE_CONTENTTYPE_ERROR");
-
onRenderError(WXErrorCode.WX_DEGRAD_ERR_BUNDLE_CONTENTTYPE_ERROR.getErrorCode(),
+ wxErrorCode =
WXErrorCode.WX_DEGRAD_ERR_BUNDLE_CONTENTTYPE_ERROR.getErrorCode();
+ onRenderError(wxErrorCode,
"|response.errorMsg==" + response.errorMsg +
"|instance bundleUrl = \n" + instance.getBundleUrl() +
"|instance requestUrl = \n" +
Uri.decode(WXSDKInstance.requestUrl)
@@ -1900,16 +1940,20 @@ public void onHttpFinish(WXResponse response) {
// check content-length
} else if (response!=null && response.originalData!=null &&
TextUtils.equals("-206", response.statusCode)) {
WXLogUtils.e("user intercept:
WX_DEGRAD_ERR_NETWORK_CHECK_CONTENT_LENGTH_FAILED");
- onRenderError(
-
WXErrorCode.WX_DEGRAD_ERR_NETWORK_CHECK_CONTENT_LENGTH_FAILED.getErrorCode(),
+ wxErrorCode =
WXErrorCode.WX_DEGRAD_ERR_NETWORK_CHECK_CONTENT_LENGTH_FAILED.getErrorCode();
+ onRenderError(wxErrorCode ,
WXErrorCode.WX_DEGRAD_ERR_NETWORK_CHECK_CONTENT_LENGTH_FAILED.getErrorCode() +
"|response.errorMsg==" + response.errorMsg
);
}
else {
-
onRenderError(WXErrorCode.WX_DEGRAD_ERR_NETWORK_BUNDLE_DOWNLOAD_FAILED.getErrorCode(),
+ wxErrorCode =
WXErrorCode.WX_DEGRAD_ERR_NETWORK_BUNDLE_DOWNLOAD_FAILED.getErrorCode();
+ onRenderError(wxErrorCode,
response.errorMsg);
}
+ if (!WXInstanceApm.VALUE_ERROR_CODE_DEFAULT.equals(wxErrorCode)){
+
mApmForInstance.addProperty(WXInstanceApm.KEY_PROPERTIES_ERROR_CODE,wxErrorCode);
+ }
}
}
diff --git a/android/sdk/src/main/java/com/taobao/weex/WXSDKManager.java
b/android/sdk/src/main/java/com/taobao/weex/WXSDKManager.java
index c5b579e9b4..b99b48412b 100644
--- a/android/sdk/src/main/java/com/taobao/weex/WXSDKManager.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXSDKManager.java
@@ -48,6 +48,7 @@
import com.taobao.weex.common.WXRuntimeException;
import com.taobao.weex.common.WXThread;
import com.taobao.weex.common.WXWorkThreadManager;
+import com.taobao.weex.performance.IApmGenerator;
import com.taobao.weex.performance.IWXAnalyzer;
import com.taobao.weex.ui.WXRenderManager;
import com.taobao.weex.utils.WXLogUtils;
@@ -79,6 +80,7 @@
private IActivityNavBarSetter mActivityNavBarSetter;
private IWXAccessibilityRoleAdapter mRoleAdapter;
private List<IWXAnalyzer> mWXAnalyzerList;
+ private IApmGenerator mApmGenerater;
private ICrashInfoReporter mCrashInfo;
@@ -341,6 +343,10 @@ public void setIWXJSExceptionAdapter(IWXJSExceptionAdapter
IWXJSExceptionAdapter
return mIWXHttpAdapter;
}
+ public IApmGenerator getApmGenerater() {
+ return mApmGenerater;
+ }
+
public @NonNull URIAdapter getURIAdapter() {
if(mURIAdapter == null){
mURIAdapter = new DefaultUriAdapter();
@@ -384,6 +390,7 @@ void setInitConfig(InitConfig config){
this.mIWXJSExceptionAdapter = config.getJSExceptionAdapter();
this.mIWXSoLoaderAdapter = config.getIWXSoLoaderAdapter();
this.mClassLoaderAdapter = config.getClassLoaderAdapter();
+ this.mApmGenerater = config.getApmGenerater();
}
public IWXStorageAdapter getIWXStorageAdapter(){
diff --git
a/android/sdk/src/main/java/com/taobao/weex/adapter/DefaultWXHttpAdapter.java
b/android/sdk/src/main/java/com/taobao/weex/adapter/DefaultWXHttpAdapter.java
index 6e96756e06..2d267651f0 100644
---
a/android/sdk/src/main/java/com/taobao/weex/adapter/DefaultWXHttpAdapter.java
+++
b/android/sdk/src/main/java/com/taobao/weex/adapter/DefaultWXHttpAdapter.java
@@ -22,6 +22,8 @@
import android.support.annotation.Nullable;
import android.text.TextUtils;
+import com.taobao.weex.WXSDKInstance;
+import com.taobao.weex.WXSDKManager;
import com.taobao.weex.common.WXRequest;
import com.taobao.weex.common.WXResponse;
@@ -60,6 +62,13 @@ public void sendRequest(final WXRequest request, final
OnHttpListener listener)
execute(new Runnable() {
@Override
public void run() {
+ WXSDKInstance instance =
WXSDKManager.getInstance().getAllInstanceMap().get(request.instanceId);
+ if (null != instance && !instance.isDestroy()){
+ instance.getApmForInstance().actionNetRequest();
+ }
+
+ boolean isNetRequestSucceed = true;
+
WXResponse response = new WXResponse();
IEventReporterDelegate reporter = getEventReporterDelegate();
try {
@@ -79,11 +88,13 @@ public void run() {
response.originalData = readInputStreamAsBytes(rawStream,
listener);
} else {
response.errorMsg = readInputStream(connection.getErrorStream(),
listener);
+ isNetRequestSucceed = false;
}
if (listener != null) {
listener.onHttpFinish(response);
}
} catch (IOException|IllegalArgumentException e) {
+ isNetRequestSucceed = false;
e.printStackTrace();
response.statusCode = "-1";
response.errorCode="-1";
@@ -99,6 +110,9 @@ public void run() {
}
}
}
+ if (null != instance && !instance.isDestroy()){
+
instance.getApmForInstance().actionNetResult(isNetRequestSucceed,null);
+ }
}
});
}
diff --git a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java
b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java
index 2e86540049..89de3df3fe 100644
--- a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java
+++ b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java
@@ -30,6 +30,7 @@
import com.taobao.weex.common.WXErrorCode;
import com.taobao.weex.dom.CSSShorthand;
import com.taobao.weex.layout.ContentBoxMeasurement;
+import com.taobao.weex.performance.WXInstanceApm;
import com.taobao.weex.utils.WXExceptionUtils;
import com.taobao.weex.utils.WXLogUtils;
import com.taobao.weex.utils.WXWsonJSONSwitch;
@@ -187,6 +188,14 @@ private int callNative(String instanceId, JSONArray tasks,
String callback){
WXLogUtils.e(TAG, "callNative throw exception:" + e.getMessage());
}
+ if (null != instance){
+
instance.getApmForInstance().updateFSDiffStats(WXInstanceApm.KEY_PAGE_STATS_FS_CALL_NATIVE_NUM,1);
+ instance.getApmForInstance().updateFSDiffStats(
+ WXInstanceApm.KEY_PAGE_STATS_FS_CALL_NATIVE_TIME,
+ System.currentTimeMillis()-start
+ );
+ }
+
if (WXEnvironment.isApkDebugable()) {
if (errorCode == IWXBridge.DESTROY_INSTANCE) {
WXLogUtils.w("destroyInstance :" + instanceId + " JSF must stop
callNative");
diff --git
a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java
b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java
index cf63498938..f357d6d633 100644
--- a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java
+++ b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java
@@ -43,6 +43,7 @@
import com.taobao.weex.common.*;
import com.taobao.weex.dom.CSSShorthand;
import com.taobao.weex.layout.ContentBoxMeasurement;
+import com.taobao.weex.performance.WXInstanceApm;
import com.taobao.weex.ui.WXComponentRegistry;
import com.taobao.weex.ui.action.*;
import com.taobao.weex.ui.component.WXComponent;
@@ -1201,8 +1202,12 @@ public void run() {
@Override
public void run() {
long start = System.currentTimeMillis();
+
instance.getApmForInstance().onStage(WXInstanceApm.KEY_PAGE_STAGES_LOAD_BUNDLE_START,start);
invokeCreateInstance(instance, template, options, data);
- instance.getWXPerformance().callCreateInstanceTime =
System.currentTimeMillis();
+ long end = System.currentTimeMillis();
+ instance.getWXPerformance().callCreateInstanceTime = end;
+
instance.getApmForInstance().onStage(WXInstanceApm.KEY_PAGE_STAGES_LOAD_BUNDLE_END,end);
+
long totalTime = instance.getWXPerformance().callCreateInstanceTime -
start;
if (totalTime > 0) {
instance.getWXPerformance().communicateTime = totalTime;
@@ -1524,7 +1529,10 @@ public void invokeExecJS(String instanceId, String
namespace, String function,
mWXBridge.execJS(instanceId, namespace, function, args);
WXSDKInstance instance =
WXSDKManager.getInstance().getSDKInstance(instanceId);
if (null != instance){
- instance.callJsTime(System.currentTimeMillis()-start);
+ long diff = System.currentTimeMillis()-start;
+
instance.getApmForInstance().updateFSDiffStats(WXInstanceApm.KEY_PAGE_STATS_FS_CALL_JS_NUM,1);
+
instance.getApmForInstance().updateFSDiffStats(WXInstanceApm.KEY_PAGE_STATS_FS_CALL_JS_TIME,diff);
+ instance.callJsTime(diff);
}
}
diff --git
a/android/sdk/src/main/java/com/taobao/weex/common/WXImageStrategy.java
b/android/sdk/src/main/java/com/taobao/weex/common/WXImageStrategy.java
index 6b9b51dd33..31524b26a7 100644
--- a/android/sdk/src/main/java/com/taobao/weex/common/WXImageStrategy.java
+++ b/android/sdk/src/main/java/com/taobao/weex/common/WXImageStrategy.java
@@ -54,7 +54,18 @@
* running weex instanceId
* @see WXSDKInstance#mInstanceId
*/
- public String instanceId;;
+ public String instanceId;
+
+ public WXImageStrategy()
+ {
+
+ }
+
+ public WXImageStrategy(String instanceId)
+ {
+ this.instanceId = instanceId;
+ }
+
public ImageListener getImageListener() {
return imageListener;
diff --git
a/android/sdk/src/main/java/com/taobao/weex/common/WXPerformance.java
b/android/sdk/src/main/java/com/taobao/weex/common/WXPerformance.java
index bd478373a4..de66d3770a 100644
--- a/android/sdk/src/main/java/com/taobao/weex/common/WXPerformance.java
+++ b/android/sdk/src/main/java/com/taobao/weex/common/WXPerformance.java
@@ -23,6 +23,7 @@
import com.taobao.weex.WXEnvironment;
import com.taobao.weex.WXSDKInstance;
import com.taobao.weex.WXSDKManager;
+import com.taobao.weex.performance.WXInstanceApm;
import com.taobao.weex.utils.WXViewUtils;
import java.util.HashMap;
@@ -30,6 +31,7 @@
import java.util.List;
import java.util.Map;
+@Deprecated
public class WXPerformance {
@RestrictTo(RestrictTo.Scope.LIBRARY)
@@ -44,8 +46,9 @@
networkType,
connectionType,
zcacheInfo,
- activity,
- instanceType,
+ wxContainerName,
+ wxInstanceType,
+ wxParentPage,
wxdim1,
wxdim2,
wxdim3,
@@ -460,10 +463,12 @@ public WXPerformance(String instanceId){
quotas.put(Dimension.useScroller.toString(), String.valueOf(useScroller));
WXSDKInstance sdkInstance =
WXSDKManager.getInstance().getSDKInstance(mInstanceId);
- String keyActivity = Dimension.activity.toString();
+ String keyActivity = WXInstanceApm.KEY_PAGE_PROPERTIES_CONTAINER_NAME;
quotas.put(keyActivity, null == sdkInstance? "unKnow" :
sdkInstance.getContainerInfo().get(keyActivity));
- String keyType = Dimension.instanceType.toString();
+ String keyType = WXInstanceApm.KEY_PAGE_PROPERTIES_INSTANCE_TYPE;
quotas.put(keyType,sdkInstance == null ?"unKnow":
sdkInstance.getContainerInfo().get(keyType));
+ String keyParentPae = WXInstanceApm.KEY_PAGE_PROPERTIES_PARENT_PAGE;
+ quotas.put(keyParentPae,null == sdkInstance
?"unKnow":sdkInstance.getContainerInfo().get(keyParentPae));
// TODO These attribute will be moved to elsewhere
// Extra Dimension for 3rd developers.
diff --git
a/android/sdk/src/main/java/com/taobao/weex/performance/IApmGenerator.java
b/android/sdk/src/main/java/com/taobao/weex/performance/IApmGenerator.java
new file mode 100644
index 0000000000..face350632
--- /dev/null
+++ b/android/sdk/src/main/java/com/taobao/weex/performance/IApmGenerator.java
@@ -0,0 +1,27 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.taobao.weex.performance;
+
+public interface IApmGenerator {
+ /**
+ * @param type apm type
+ * @return impl
+ */
+ IWXApmMonitorAdapter generateApmInstance(String type);
+}
diff --git
a/android/sdk/src/main/java/com/taobao/weex/performance/IWXApmMonitorAdapter.java
b/android/sdk/src/main/java/com/taobao/weex/performance/IWXApmMonitorAdapter.java
new file mode 100644
index 0000000000..6abc620911
--- /dev/null
+++
b/android/sdk/src/main/java/com/taobao/weex/performance/IWXApmMonitorAdapter.java
@@ -0,0 +1,81 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.taobao.weex.performance;
+
+public interface IWXApmMonitorAdapter {
+
+ /**
+ * start record
+ *
+ * @param instanceId instanceId
+ */
+ void onStart(String instanceId);
+
+ /**
+ * end record
+ */
+ void onEnd();
+
+ /**
+ * record event
+ */
+ void onEvent(String name, Object value);
+
+ /**
+ * record stage
+ */
+ void onStage(String name, long timestamp);
+
+ /**
+ * record property
+ */
+ void addProperty(String key, Object value);
+
+ /**
+ * record statistic
+ */
+ void addStats(String key, double value);
+
+ /**
+ * record subProcedure stage
+ */
+
+ void onSubProcedureStage(String procedureName, String stageName);
+
+ /**
+ * record SubProcedure event
+ */
+
+ void onSubProcedureEvent(String procedureName, String eventName);
+
+ /**
+ * record subProcedure stats
+ */
+ void setSubProcedureStats(String procedureName, String name, double value);
+
+ /**
+ * record subProcedure properties
+ */
+ void setSubProcedureProperties(String procedureName, String name, Object
value);
+
+ void onAppear();
+
+ void onDisappear();
+
+}
diff --git
a/android/sdk/src/main/java/com/taobao/weex/performance/WXInstanceApm.java
b/android/sdk/src/main/java/com/taobao/weex/performance/WXInstanceApm.java
new file mode 100644
index 0000000000..7971e0dc79
--- /dev/null
+++ b/android/sdk/src/main/java/com/taobao/weex/performance/WXInstanceApm.java
@@ -0,0 +1,299 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.taobao.weex.performance;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import com.taobao.weex.WXEnvironment;
+import com.taobao.weex.WXSDKInstance;
+import com.taobao.weex.WXSDKManager;
+
+public class WXInstanceApm {
+
+ public static final String WEEX_PAGE_TOPIC = "weex_page";
+
+ /************** properties *****************/
+ public static final String KEY_PROPERTIES_ERROR_CODE = "wxErrorCode";
+ //public static final String KEY_PAGE_PROPERTIES_LAUNCH_ID = "wxLaunchId";
+ public static final String KEY_PAGE_PROPERTIES_BIZ_ID = "wxBizID";
+ public static final String KEY_PAGE_PROPERTIES_JSLIB_VERSION =
"wxJSLibVersion";
+ public static final String KEY_PAGE_PROPERTIES_WEEX_VERSION =
"wxSDKVersion";
+ public static final String KEY_PAGE_PROPERTIES_REQUEST_TYPE =
"wxRequestType";
+ public static final String KEY_PAGE_PROPERTIES_CACHE_TYPE = "wxCacheType";
+ public static final String KEY_PAGE_PROPERTIES_CACHE_INFO = "wxZCacheInfo";
+ public static final String KEY_PAGE_PROPERTIES_JS_FM_INI =
"wxJsFrameworkInit";
+ public static final String KEY_PAGE_PROPERTIES_CONTAINER_NAME =
"wxContainerName";
+ public static final String KEY_PAGE_PROPERTIES_INSTANCE_TYPE =
"wxInstanceType";
+ public static final String KEY_PAGE_PROPERTIES_PARENT_PAGE =
"wxParentPage";
+
+ /************** stages *****************/
+ public static final String KEY_PAGE_STAGES_DOWN_BUNDLE_START =
"wxStartDownLoadBundle";
+ public static final String KEY_PAGE_STAGES_DOWN_BUNDLE_END =
"wxEndDownLoadBundle";
+ public static final String KEY_PAGE_STAGES_RENDER_ORGIGIN =
"wxRenderTimeOrigin";
+ public static final String KEY_PAGE_STAGES_LOAD_BUNDLE_START =
"wxStartLoadBundle";
+ public static final String KEY_PAGE_STAGES_LOAD_BUNDLE_END =
"wxEndLoadBundle";
+ public static final String KEY_PAGE_STAGES_FSRENDER = "wxFsRender";
+ public static final String KEY_PAGE_STAGES_INTERACTION = "wxInteraction";
+ public static final String KEY_PAGE_STAGES_DESTROY = "wxDestroy";
+
+ /************** stats *****************/
+ public static final String KEY_PAGE_STATS_BUNDLE_SIZE = "wxBundleSize";
+ public static final String KEY_PAGE_STATS_FS_CALL_JS_TIME =
"wxFSCallJsTotalTime";
+ public static final String KEY_PAGE_STATS_FS_CALL_JS_NUM =
"wxFSCallJsTotalNum";
+ public static final String KEY_PAGE_STATS_FS_TIMER_NUM = "wxFSTimerCount";
+ public static final String KEY_PAGE_STATS_FS_CALL_NATIVE_TIME =
"wxFSCallNativeTotalTime";
+ public static final String KEY_PAGE_STATS_FS_CALL_NATIVE_NUM =
"wxFSCallNativeTotalNum";
+ public static final String KEY_PAGE_STATS_FS_CALL_EVENT_NUM =
"wxFSCallEventTotalNum";
+ public static final String KEY_PAGE_STATS_FS_REQUEST_NUM =
"wxFSRequestNum";
+ public static final String KEY_PAGE_STATS_CELL_EXCEED_NUM =
"wxCellExceedNum";
+ public static final String KEY_PAGE_STATS_MAX_DEEP_VIEW =
"wxMaxDeepViewLayer";
+ public static final String KEY_PAGE_STATS_MAX_DEEP_DOM =
"wxMaxDeepVDomLayer";
+ public static final String KEY_PAGE_STATS_MAX_COMPONENT_NUM =
"wxMaxComponentCount";
+ public static final String KEY_PAGE_STATS_WRONG_IMG_SIZE_COUNT =
"wxWrongImgSizeCount";
+
+ public static final String KEY_PAGE_STATS_SCROLLER_NUM = "wxScrollerCount";
+ public static final String KEY_PAGE_STATS_CELL_DATA_UN_RECYCLE_NUM =
"wxCellDataUnRecycleCount";
+ public static final String KEY_PAGE_STATS_CELL_UN_RE_USE_NUM =
"wxCellUnReUseCount";
+ public static final String KEY_PAGE_STATS_IMG_UN_RECYCLE_NUM =
"wxImgUnRecycleCount";
+
+ public static final String KEY_PAGE_STATS_I_SCREEN_VIEW_COUNT =
"wxInteractionScreenViewCount";
+ public static final String KEY_PAGE_STATS_I_ALL_VIEW_COUNT =
"wxInteractionAllViewCount";
+ public static final String KEY_PAGE_STATS_I_COMPONENT_CREATE_COUNT =
"wxInteractionComponentCreateCount";
+ public static final String KEY_PAGE_ANIM_BACK_NUM =
"wxAnimationInBackCount";
+ public static final String KEY_PAGE_TIMER_BACK_NUM = "wxTimerInBackCount";
+ public static final String KEY_PAGE_STATS_ACTUAL_DOWNLOAD_TIME =
"wxActualNetworkTime";
+
+ public static final String KEY_PAGE_STATS_IMG_LOAD_NUM = "wxImgLoadCount";
+ public static final String KEY_PAGE_STATS_IMG_LOAD_SUCCESS_NUM =
"wxImgLoadSuccessCount";
+ public static final String KEY_PAGE_STATS_IMG_LOAD_FAIL_NUM =
"wxImgLoadFailCount";
+ public static final String KEY_PAGE_STATS_NET_NUM =
"wxNetworkRequestCount";
+ public static final String KEY_PAGE_STATS_NET_SUCCESS_NUM =
"wxNetworkRequestSuccessCount";
+ public static final String KEY_PAGE_STATS_NET_FAIL_NUM =
"wxNetworkRequestFailCount";
+ public static final String KEY_PAGE_STATS_JSLIB_INIT_TIME =
"wxJSLibInitTime";
+
+ /************** value *****************/
+ public static final String VALUE_ERROR_CODE_DEFAULT = "0";
+
+ private String mInstanceId;
+ private IWXApmMonitorAdapter apmInstance;
+ private Map<String, Double> recordStatsMap;
+ private boolean isFSEnd;
+
+ public WXInstanceApm(String instanceId) {
+ mInstanceId = instanceId;
+ IApmGenerator generator = WXSDKManager.getInstance().getApmGenerater();
+ if (null != generator) {
+ apmInstance = generator.generateApmInstance(WEEX_PAGE_TOPIC);
+ recordStatsMap = new HashMap<>();
+ }
+ }
+
+ /**
+ * record event
+ */
+ public void onEvent(String name, Object value) {
+ if (null == apmInstance) {
+ return;
+ }
+ apmInstance.onEvent(name, value);
+ }
+
+ /**
+ * record stage
+ */
+ public void onStage(String name, long timestamp) {
+ if (null == apmInstance) {
+ return;
+ }
+ apmInstance.onStage(name, timestamp);
+ }
+
+ /**
+ * record property
+ */
+ public void addProperty(String key, Object value) {
+ if (null == apmInstance) {
+ return;
+ }
+ apmInstance.addProperty(key, value);
+ }
+
+ /**
+ * record statistic
+ */
+ public void addStats(String key, double value) {
+ if (null == apmInstance) {
+ return;
+ }
+ apmInstance.addStats(key, value);
+ }
+
+ /**
+ * start record
+ */
+ public void onStart() {
+ if (null == apmInstance) {
+ return;
+ }
+ apmInstance.onStart(mInstanceId);
+ WXSDKInstance instance =
WXSDKManager.getInstance().getAllInstanceMap().get(mInstanceId);
+ String url = null == instance ? "unKnowUrl" : instance.getBundleUrl();
+ addProperty(KEY_PAGE_PROPERTIES_BIZ_ID, url);
+ addProperty(KEY_PROPERTIES_ERROR_CODE, VALUE_ERROR_CODE_DEFAULT);
+ addProperty(KEY_PAGE_PROPERTIES_JSLIB_VERSION,
WXEnvironment.JS_LIB_SDK_VERSION);
+ addProperty(KEY_PAGE_PROPERTIES_WEEX_VERSION,
WXEnvironment.WXSDK_VERSION);
+ if (null != instance) {
+ for (Map.Entry<String, String> entry :
instance.getContainerInfo().entrySet()) {
+ addProperty(entry.getKey(), entry.getValue());
+ }
+ }
+ }
+
+ public void onAppear(){
+ if (null == apmInstance) {
+ return;
+ }
+ apmInstance.onAppear();
+ }
+
+ public void onDisAppear(){
+ if (null == apmInstance) {
+ return;
+ }
+ apmInstance.onDisappear();
+ }
+
+ /**
+ * end record
+ */
+ public void onEnd() {
+ if (null == apmInstance) {
+ return;
+ }
+ apmInstance.onStage(KEY_PAGE_STAGES_DESTROY,
System.currentTimeMillis());
+ apmInstance.onEnd();
+ }
+
+ public void arriveFSRenderTime() {
+ if (null == apmInstance || isFSEnd) {
+ return;
+ }
+ isFSEnd = true;
+ onStage(WXInstanceApm.KEY_PAGE_STAGES_FSRENDER,
System.currentTimeMillis());
+ }
+
+ public void arriveInteraction(int screenViewCount, int allViewCount) {
+ if (null == apmInstance) {
+ return;
+ }
+ onStage(WXInstanceApm.KEY_PAGE_STAGES_INTERACTION,
System.currentTimeMillis());
+ updateMaxStats(KEY_PAGE_STATS_I_SCREEN_VIEW_COUNT, screenViewCount);
+ updateMaxStats(KEY_PAGE_STATS_I_ALL_VIEW_COUNT, allViewCount);
+ WXSDKInstance instance =
WXSDKManager.getInstance().getSDKInstance(mInstanceId);
+ if (null != instance) {
+ updateMaxStats(KEY_PAGE_STATS_I_COMPONENT_CREATE_COUNT,
instance.getWXPerformance().componentCount);
+ }
+ }
+
+ public void updateFSDiffStats(String name, double diffValue) {
+ if (null == apmInstance || isFSEnd) {
+ return;
+ }
+ updateDiffStats(name, diffValue);
+ }
+
+ public void updateDiffStats(String name, double diffValue) {
+ if (null == apmInstance) {
+ return;
+ }
+ double preVal = recordStatsMap.containsKey(name) ?
recordStatsMap.get(name) : 0;
+ double currentValue = preVal + diffValue;
+ recordStatsMap.put(name, currentValue);
+ addStats(name, currentValue);
+ }
+
+ public void updateMaxStats(String name, double currentVal) {
+ if (null == apmInstance) {
+ return;
+ }
+ double maxValue = recordStatsMap.containsKey(name) ?
recordStatsMap.get(name) : 0;
+ if (maxValue < currentVal) {
+ maxValue = currentVal;
+ recordStatsMap.put(name, currentVal);
+ addStats(name, maxValue);
+ }
+ }
+
+ public void updateExtInfo(Map<String, Object> extParams) {
+ if (null == apmInstance || null == extParams) {
+ return;
+ }
+
+ addPropeyFromExtParms("requestType", KEY_PAGE_PROPERTIES_REQUEST_TYPE,
extParams);
+ addPropeyFromExtParms("cacheType", KEY_PAGE_PROPERTIES_CACHE_TYPE,
extParams);
+ addPropeyFromExtParms("zCacheInfo", KEY_PAGE_PROPERTIES_CACHE_INFO,
extParams);
+
+ addStats(KEY_PAGE_STATS_JSLIB_INIT_TIME, WXEnvironment.sJSLibInitTime);
+ addProperty(KEY_PAGE_PROPERTIES_JS_FM_INI,
WXEnvironment.JsFrameworkInit);
+
+ Object wxNetLibDownBundleTime = extParams.get("actualNetworkTime");
+ if (wxNetLibDownBundleTime instanceof Long) {
+ updateDiffStats(KEY_PAGE_STATS_ACTUAL_DOWNLOAD_TIME,
((Long)wxNetLibDownBundleTime).doubleValue());
+ }
+ }
+
+ private void addPropeyFromExtParms(String fromKey, String toKey,
Map<String, Object> extParams) {
+ Object value = extParams.get(fromKey);
+ if (value instanceof String) {
+ addProperty(toKey, value);
+ }
+ }
+
+ /************** called by IWXHttpAdapter implementer *****************/
+
+ public void actionNetRequest() {
+ if (!isFSEnd) {
+ updateFSDiffStats(WXInstanceApm.KEY_PAGE_STATS_FS_REQUEST_NUM, 1);
+ }
+ updateDiffStats(WXInstanceApm.KEY_PAGE_STATS_NET_NUM, 1);
+ }
+
+ public void actionNetResult(boolean succeed, String errorCode) {
+ if (succeed) {
+ updateDiffStats(WXInstanceApm.KEY_PAGE_STATS_NET_SUCCESS_NUM, 1);
+ } else {
+ updateDiffStats(WXInstanceApm.KEY_PAGE_STATS_NET_FAIL_NUM, 1);
+ }
+ }
+
+ /************** called by IWXImgLoaderAdapter implementer
*****************/
+
+ public void actionLoadImg() {
+ updateDiffStats(WXInstanceApm.KEY_PAGE_STATS_IMG_LOAD_NUM, 1);
+ }
+
+ public void actionLoadImgResult(boolean succeed, String errorCode) {
+ if (succeed) {
+ updateDiffStats(WXInstanceApm.KEY_PAGE_STATS_IMG_LOAD_SUCCESS_NUM,
1);
+ } else {
+ updateDiffStats(WXInstanceApm.KEY_PAGE_STATS_IMG_LOAD_FAIL_NUM, 1);
+ }
+ }
+}
diff --git
a/android/sdk/src/main/java/com/taobao/weex/ui/RenderContextImpl.java
b/android/sdk/src/main/java/com/taobao/weex/ui/RenderContextImpl.java
index d5093d1d87..2aa40506ed 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/RenderContextImpl.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/RenderContextImpl.java
@@ -77,4 +77,8 @@ public void registerComponent(String ref, WXComponent comp) {
public WXComponent unregisterComponent(String ref) {
return mRegistry.remove(ref);
}
+
+ public int getComponentCount(){
+ return mRegistry.size();
+ }
}
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/WXRenderManager.java
b/android/sdk/src/main/java/com/taobao/weex/ui/WXRenderManager.java
index fd9c1811e9..95cabd79b5 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/WXRenderManager.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/WXRenderManager.java
@@ -28,6 +28,7 @@
import com.taobao.weex.common.WXRuntimeException;
import com.taobao.weex.common.WXThread;
import com.taobao.weex.dom.RenderContext;
+import com.taobao.weex.performance.WXInstanceApm;
import com.taobao.weex.ui.action.BasicGraphicAction;
import com.taobao.weex.ui.component.WXComponent;
import com.taobao.weex.utils.WXExceptionUtils;
@@ -153,12 +154,24 @@ public void registerComponent(String instanceId, String
ref, WXComponent comp) {
RenderContextImpl statement = mRenderContext.get(instanceId);
if (statement != null) {
statement.registerComponent(ref, comp);
+ if (null != statement.getInstance()){
+ statement.getInstance().getApmForInstance().updateMaxStats(
+ WXInstanceApm.KEY_PAGE_STATS_MAX_COMPONENT_NUM,
+ statement.getComponentCount()
+ );
+ }
}
}
public WXComponent unregisterComponent(String instanceId, String ref) {
RenderContextImpl statement = mRenderContext.get(instanceId);
if (statement != null) {
+ if (null != statement.getInstance()){
+ statement.getInstance().getApmForInstance().updateMaxStats(
+ WXInstanceApm.KEY_PAGE_STATS_MAX_COMPONENT_NUM,
+ statement.getComponentCount()
+ );
+ }
return statement.unregisterComponent(ref);
} else {
return null;
diff --git
a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java
b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java
index 8eec5f2baa..ce789923bb 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java
@@ -73,6 +73,7 @@
import com.taobao.weex.dom.WXStyle;
import com.taobao.weex.dom.transition.WXTransition;
import com.taobao.weex.layout.ContentBoxMeasurement;
+import com.taobao.weex.performance.WXInstanceApm;
import com.taobao.weex.tracing.Stopwatch;
import com.taobao.weex.tracing.WXTracing;
import com.taobao.weex.ui.IFComponentHolder;
@@ -932,6 +933,7 @@ public final void setLayout(WXComponent component) {
}
if (this instanceof WXCell && realHeight >=
WXPerformance.VIEW_LIMIT_HEIGHT && realWidth>=WXPerformance.VIEW_LIMIT_WIDTH){
+
mInstance.getApmForInstance().updateDiffStats(WXInstanceApm.KEY_PAGE_STATS_CELL_EXCEED_NUM,1);
mInstance.getWXPerformance().cellExceedNum++;
}
diff --git
a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXEmbed.java
b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXEmbed.java
index 7b113079de..bc34dabade 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXEmbed.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXEmbed.java
@@ -37,6 +37,8 @@
import com.taobao.weex.common.WXPerformance;
import com.taobao.weex.common.WXPerformance.Dimension;
import com.taobao.weex.common.WXRenderStrategy;
+import com.taobao.weex.performance.WXInstanceApm;
+import com.taobao.weex.ui.IFComponentHolder;
import com.taobao.weex.ui.action.BasicComponentData;
import com.taobao.weex.utils.WXLogUtils;
import com.taobao.weex.utils.WXUtils;
@@ -289,8 +291,10 @@ public void setPriority(String priority) {
*/
protected void loadContent(){
mNestedInstance = createInstance();
-
mNestedInstance.setContainerInfo(Dimension.instanceType.toString(),"embed");
-
mNestedInstance.setContainerInfo("parentPage",getInstance().getBundleUrl());
+ if (null != mNestedInstance){
+
mNestedInstance.setContainerInfo(WXInstanceApm.KEY_PAGE_PROPERTIES_INSTANCE_TYPE,"embed");
+
mNestedInstance.setContainerInfo(WXInstanceApm.KEY_PAGE_PROPERTIES_PARENT_PAGE,getInstance().getBundleUrl());
+ }
if(mListener != null && mListener.mEventListener != null){
if(!mListener.mEventListener.onPreCreate(this,src)){
//cancel render
diff --git
a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXImage.java
b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXImage.java
index c366336ec0..596db8b62d 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXImage.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXImage.java
@@ -51,6 +51,7 @@
import com.taobao.weex.common.WXImageSharpen;
import com.taobao.weex.common.WXImageStrategy;
import com.taobao.weex.common.WXRuntimeException;
+import com.taobao.weex.performance.WXInstanceApm;
import com.taobao.weex.ui.ComponentCreator;
import com.taobao.weex.ui.action.BasicComponentData;
import com.taobao.weex.ui.view.WXImageView;
@@ -131,6 +132,9 @@ protected boolean setProperty(String key, Object param) {
return true;
case Constants.Name.AUTO_RECYCLE:
mAutoRecycle = WXUtils.getBoolean(param, mAutoRecycle);
+ if (!mAutoRecycle && null != getInstance()){
+
getInstance().getApmForInstance().updateDiffStats(WXInstanceApm.KEY_PAGE_STATS_IMG_UN_RECYCLE_NUM,1);
+ }
return true;
case Constants.Name.FILTER:
int blurRadius = 0;
@@ -290,7 +294,7 @@ public void autoRecoverImage() {
private void setRemoteSrc(Uri rewrited,int blurRadius) {
- WXImageStrategy imageStrategy = new WXImageStrategy();
+ WXImageStrategy imageStrategy = new WXImageStrategy(getInstanceId());
imageStrategy.isClipping = true;
WXImageSharpen imageSharpen = getAttrs().getImageSharpen();
@@ -458,6 +462,7 @@ private void monitorImgSize(ImageView imageView){
if (img.getIntrinsicHeight() * img.getIntrinsicWidth() >
imageView.getMeasuredHeight() *
imageView.getMeasuredWidth()){
instance.getWXPerformance().wrongImgSizeCount++;
+
instance.getApmForInstance().updateDiffStats(WXInstanceApm.KEY_PAGE_STATS_WRONG_IMG_SIZE_COUNT,1);
}
}
diff --git
a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXScroller.java
b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXScroller.java
index 94845eabcf..c61baabd2d 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXScroller.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXScroller.java
@@ -47,6 +47,7 @@
import com.taobao.weex.common.ICheckBindingScroller;
import com.taobao.weex.common.OnWXScrollListener;
import com.taobao.weex.common.WXThread;
+import com.taobao.weex.performance.WXInstanceApm;
import com.taobao.weex.ui.ComponentCreator;
import com.taobao.weex.ui.action.BasicComponentData;
import com.taobao.weex.ui.component.helper.ScrollStartEndHelper;
@@ -117,6 +118,7 @@ public WXScroller(WXSDKInstance instance, WXVContainer
parent, String instanceId
public WXScroller(WXSDKInstance instance, WXVContainer parent,
BasicComponentData basicComponentData) {
super(instance, parent, basicComponentData);
stickyHelper = new WXStickyHelper(this);
+
instance.getApmForInstance().updateDiffStats(WXInstanceApm.KEY_PAGE_STATS_SCROLLER_NUM,1);
}
/**
diff --git
a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXCell.java
b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXCell.java
index a30a1ac388..9ee18c7eb1 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXCell.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXCell.java
@@ -22,6 +22,7 @@
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.annotation.RestrictTo;
+import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
@@ -30,6 +31,7 @@
import com.taobao.weex.annotation.Component;
import com.taobao.weex.common.Constants;
import com.taobao.weex.dom.WXAttr;
+import com.taobao.weex.performance.WXInstanceApm;
import com.taobao.weex.ui.action.BasicComponentData;
import com.taobao.weex.ui.component.WXVContainer;
import com.taobao.weex.ui.flat.WidgetContainer;
@@ -37,6 +39,7 @@
import com.taobao.weex.utils.WXLogUtils;
import com.taobao.weex.utils.WXUtils;
import com.taobao.weex.utils.WXViewUtils;
+import org.w3c.dom.Text;
import java.util.LinkedList;
@@ -86,6 +89,12 @@ public WXCell(WXSDKInstance instance, WXVContainer parent,
boolean isLazy, Basic
WXLogUtils.e("Cell", WXLogUtils.getStackTrace(e));
}
}
+ if (!canRecycled()){
+
instance.getApmForInstance().updateDiffStats(WXInstanceApm.KEY_PAGE_STATS_CELL_DATA_UN_RECYCLE_NUM,1);
+ }
+ if (TextUtils.isEmpty(getAttrs().getScope())){
+
instance.getApmForInstance().updateDiffStats(WXInstanceApm.KEY_PAGE_STATS_CELL_UN_RE_USE_NUM,1);
+ }
}
@Override
diff --git
a/android/sdk/src/main/java/com/taobao/weex/ui/module/WXTimerModule.java
b/android/sdk/src/main/java/com/taobao/weex/ui/module/WXTimerModule.java
index d2c711a4f3..030870870f 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/module/WXTimerModule.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/module/WXTimerModule.java
@@ -34,6 +34,7 @@
import android.util.SparseArray;
import com.taobao.weex.WXEnvironment;
+import com.taobao.weex.WXSDKInstance;
import com.taobao.weex.WXSDKManager;
import com.taobao.weex.annotation.JSMethod;
import com.taobao.weex.bridge.WXBridgeManager;
@@ -41,6 +42,7 @@
import com.taobao.weex.bridge.WXJSObject;
import com.taobao.weex.common.Destroyable;
import com.taobao.weex.common.WXModule;
+import com.taobao.weex.performance.WXInstanceApm;
import com.taobao.weex.utils.WXJsonUtils;
import com.taobao.weex.utils.WXLogUtils;
import java.lang.annotation.Retention;
@@ -72,6 +74,7 @@ public void setTimeout(@IntRange(from = 1) int funcId,
@FloatRange(from = 0) flo
if (null != mWXSDKInstance.getWXPerformance()){
mWXSDKInstance.getWXPerformance().timerInvokeCount++;
}
+
mWXSDKInstance.getApmForInstance().updateFSDiffStats(WXInstanceApm.KEY_PAGE_STATS_FS_TIMER_NUM,1);
}
}
@@ -82,6 +85,7 @@ public void setInterval(@IntRange(from = 1) int funcId,
@FloatRange(from = 0) fl
if (null != mWXSDKInstance.getWXPerformance()){
mWXSDKInstance.getWXPerformance().timerInvokeCount++;
}
+
mWXSDKInstance.getApmForInstance().updateFSDiffStats(WXInstanceApm.KEY_PAGE_STATS_FS_TIMER_NUM,1);
}
}
@@ -126,6 +130,7 @@ public boolean handleMessage(Message msg) {
if (msg.obj == null) {
break;
}
+ checkIfTimerInBack(msg.arg1);
args = createTimerArgs(msg.arg1, (Integer) msg.obj, false);
WXBridgeManager.getInstance().invokeExecJS(String.valueOf(msg.arg1),
null, METHOD_CALL_JS, args, true);
ret = true;
@@ -134,6 +139,7 @@ public boolean handleMessage(Message msg) {
if (msg.obj == null) {
break;
}
+ checkIfTimerInBack(msg.arg1);
postMessage(MODULE_INTERVAL, (Integer) msg.obj, msg.arg2, msg.arg1);
args = createTimerArgs(msg.arg1, (Integer) msg.obj, true);
WXBridgeManager.getInstance().invokeExecJS(String.valueOf(msg.arg1),
null, METHOD_CALL_JS, args, true);
@@ -146,6 +152,16 @@ public boolean handleMessage(Message msg) {
return ret;
}
+ private void checkIfTimerInBack(int instanceId){
+ WXSDKInstance instance =
WXSDKManager.getInstance().getSDKInstance(String.valueOf(instanceId));
+ if (null == instance){
+ return;
+ }
+ if (instance.isViewDisAppear()){
+
instance.getApmForInstance().updateDiffStats(WXInstanceApm.KEY_PAGE_TIMER_BACK_NUM,1);
+ }
+ }
+
@VisibleForTesting
void setHandler(Handler handler) {
this.handler = handler;
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
> [Android]APM FOR WEEX
> ---------------------
>
> Key: WEEX-545
> URL: https://issues.apache.org/jira/browse/WEEX-545
> Project: Weex
> Issue Type: Improvement
> Reporter: peihan
> Assignee: Adam Feng
> Priority: Major
>
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)