项目01-手机端模块

项目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();
    }
  }
}
posted @ 2018-08-27 20:45  大道至简(老徐)  阅读(191)  评论(0编辑  收藏  举报