项目01-手机端模块
1、项目描述
2、术语说明
-
App
手机应用程序 -
App开发商
开发App的企业和个人 -
用户
安装了App的人员。
-
数据服务商
提供数据服务的企业。
-
数据服务平台
数据服务商的产品。
-
租户
租用了数据服务商的App开发商
-
云版
数据服务商部署自己的数据服务平台到云中。
-
企业版
数据服务商出售数据服务平台系统给第三方,第三方部署该平台到自己的集群上,其中SDK(数据收集模块)收集日志的地址是自己的服务地址。
-
上报日志策略
-
启动上报
用户使用app的行为,存在本地端,通常是json格式。启动app时,上报数据
-
退出上报
app退出时上报
-
周期上报
每个多长时间上报一次。
-
3、日志类型
日志类型供分为5中类型,分别是:
-
公共日志信息
公共日志信息时每种日志都会涉及的信息,比如appid、版本、渠道、平台等信息。
//日志基础类 public class AppBaseLog { private Long createdAtMs; //日志创建时间 private String appId; //应用唯一标识 private String tenantId; //租户唯一标识,企业用户 private String deviceId; //设备唯一标识 private String appVersion; //版本 private String appChannel; //渠道,安装时就在清单中制定了,appStore等。 private String appPlatform; //平台 private String osType; //操作系统 private String deviceStyle; //机型 //getter/setter }
-
启动日志
public class AppStartupLog extends AppBaseLog{ private String country; //国家,终端不用上报,服务器自动填充该属性 private String province; //省份,终端不用上报,服务器自动填充该属性 private String ipAddress; //ip地址 private String network; //网络 private String carrier; //运营商 private String brand; //品牌 private String screenSize; //分辨率 }
-
事件日志
public class AppEventLog extends AppBaseLog { private String eventId; //事件唯一标识 private Long eventDurationSecs; //事件持续时长 private Map<String, String> paramKeyValueMap; //参数名/值对 //getter/setter }
-
页面日志
public class AppPageLog extends AppBaseLog { private int pageViewCntInSession = 0; private String pageId; //页面id private int visitIndex = 0; //访问顺序号,0为第一个页面 private String nextPage; //下一个访问页面,空表示为退出应用的页面 private Long stayDurationSecs = (long) 0; //当前页面停留时长 //getter/setter }
-
错误日志
public class AppErrorLog extends AppBaseLog { private String errorBrief; //错误摘要 private String errorDetail; //错误详情 //getter/setter }
-
使用日志
public class AppUsageLog extends AppBaseLog { private Long singleUseDurationSecs; //单次使用时长 private Long singleUploadTraffic; //单次使用过程中的上传流量 private Long singleDownloadTraffic; //单次使用过程中的下载流量 //getter/setter }
-
日志聚合体
收集上报日志时,是将手机端自上报完成后累积的日志组成日志聚合体,上传到服务器上。日志聚合体类设计如下:
package com.oldboy.umeng.common.domain; import java.util.ArrayList; import java.util.List; /** * 日志聚合体 */ public class AppLogAggEntity { private String appId; //应用唯一标识 private String tenantId; //租户唯一标识,企业用户 private String deviceId; //设备唯一标识 private String appVersion; //版本 private String appChannel; //渠道,安装时就在清单中制定了,appStore等。 private String appPlatform; //平台 private String osType; //操作系统 private String deviceStyle; //机型 //5中类型的日志集合 private List<AppStartupLog> startupLogs = new ArrayList<AppStartupLog>(); private List<AppErrorLog> errorLogs = new ArrayList<AppErrorLog>(); private List<AppEventLog> eventLogs = new ArrayList<AppEventLog>(); private List<AppUsageLog> usageLogs = new ArrayList<AppUsageLog>(); private List<AppPageLog> pageLogs = new ArrayList<AppPageLog>(); //getter/setter }
4、日志字典数据
[appid]
sohuvideo
faobengplay
tianya
gaodemap
[tenantid]
tnt009
tnt023
tnt501
[appversion]
1.0.0
1.1.0
1.2.0
2.0.0
[appchannel]
umeng
appstore
anroid bus
[appplatform]
ios
android
winphone
blackberry
[country]
china
america
[province]
henan
hebei
guangdong
guangxi
shandong
shanxi
jiazhou
[network]
wifi
cell
3g
4g
[carrier]
中国移动
中国联通
中国电信
中国铁通
[devicestyle]
iphone 6
iphone 6 plus
iphone 7
iphone 7 plus
红米
oppo 1
vivo 3
[screensize]
1136 * 640
960 * 640
480 * 320
[ostype]
ios11
android 4.0
mi 5.5
[brand]
三星
华为
Apple
魅族
小米
联想
[eventid]
popmenu
autoImport
bookstore
[eventdurationse22]
34
35
36
38
[errorbrief]
at com.oldboy.web.AbstractBaseController.validInbound(AbstractBaseController.java:72)
at com.oldboy.appIn.control.CommandUtil.getInfo(CommandUtil.java:67)
[errordetail]
java.lang.NullPointerException at com.oldboy.appIn.web.AbstractBaseController.validInbound(AbstractBaseController.java:72) at com.oldboy.dfdf.web.AbstractBaseController.validInbound
at com.oldboy.dfdfdf.control.CommandUtil.getInfo(CommandUtil.java:67) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606)
[pageid]
list.html
main.html
test.html
[visitindex]
0
1
2
3
4
[nextpage]
list.html
main.html
test.html
[staydurationsec]
45
2
78
123
456
234
5、编写上传程序代码
package com.oldboy.umeng.phone;
import com.alibaba.fastjson.JSON;
import com.oldboy.umeng.common.domain.AppLogAggEntity;
import com.oldboy.umeng.common.util.LogUtil;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.util.Date;
/**
* 手机端程序类,收集本地日志,聚合成json,上报给web服务器
*/
public class ClientApp {
/**
* 上传消息给服务期
*/
public static void main(String[] args) throws Exception {
String url = "http://192.168.13.9:80/" ;
URL u = null ;
HttpURLConnection conn = null ;
//设置提交方式
try {
u = new URL(url);
conn = (HttpURLConnection) u.openConnection();
conn.setRequestMethod("POST");
//设置请求的格式
conn.setRequestProperty("content-type", "application/json");
//设置客户端时间,为了时间对齐
conn.setRequestProperty("client_time" , new Date().getTime() + "");
//设置允许输出
conn.setDoOutput(true);
OutputStream out = conn.getOutputStream();
String json = "{"id":100}" ;
out.write(json.getBytes());
out.flush();
out.close();
int code = conn.getResponseCode();
//ok
if (code == 200) {
System.out.println("发送成功 : " + json);
} else {
System.out.println("发送失败 : " + code);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}