All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.taobao.eagleeye.EagleEye Maven / Gradle / Ivy

There is a newer version: 1.8.3
Show newest version
package com.taobao.eagleeye;

import java.util.Map;

/**
 * 鹰眼是在庞大的分布式环境内跟踪一个外部请求调用各个后端服务的调用关系的系统
 * @since 1.5.0-exported
 */
public final class EagleEye {

    /**
     * 正常 TRACE 开始的 RpcId
     */
    static public final String ROOT_RPC_ID               = "0";
    /**
     * 缺少 TraceId,重新开始的 RpcId
     */
    static public final String MAL_ROOT_RPC_ID           = "9";
    /**
     * 状态码,标识调用成功
     */
    static public final String RPC_RESULT_SUCCESS        = "00";
    /**
     * 状态码,标识业务处理错误
     */
    static public final String RPC_RESULT_FAILED         = "01";
    /**
     * 状态码,标识 RPC 层出现错误
     */
    static public final String RPC_RESULT_RPC_ERROR      = "02";
    /**
     * 状态码,标识处理超时
     */
    static public final String RPC_RESULT_TIMEOUT        = "03";
    /**
     * 状态码,标识软错误,一般用于资源找不到、未命中、加锁未成功、
     * 版本不一致导致未更新等情况,需要根据中间件不同来判定
     */
    static public final String RPC_RESULT_SOFT_ERROR     = "04";
    /**
     * 状态码,标识限流错误
     */
    static public final String RPC_RESULT_LIMIT_ERROR    = "05";

    private EagleEye() {
    }

    static public void turnRpcOn() {
    }

    static public void turnRpcOff() {
    }

    static public final boolean isRpcOff() {
    	return false;
    }

    static public void turnBizOn() {
    }

    static public void turnBizOff() {
    }

    static public final boolean isBizOff() {
    	return false;
    }

    /**
     * @return 采样频率 1/x
     */
    static public int getSamplingInterval() {
    	return 1;
    }

    /**
     * @param interval 采样频率 1/x,有效范围在 [1, 9999] 之间,超出范围的数值都作为全采样处理。
     */
    static public void setSamplingInterval(int interval) {
    }

    /**
     * 开启/关闭透传功能
     * @param enable
     */
    static public void setUserDataEnabled(boolean enable) {
    }

    /**
     * 检查是否透传
     */
    static public final boolean isUserDataEnabled() {
    	return false;
    }

    /**
     * 开启/关闭日志 DUMP 功能
     * @param enable
     */
    static public void setLogDumpEnabled(boolean enable) {
    }

    /**
     * 检查是否开启日志 DUMP 功能
     */
    static public final boolean isLogDumpEnabled() {
    	return true;
    }

    /**
     * 开启新的trace。该接口仅提供给最源头的前中间件或自己启动的定时程序调用,使用该接口时, 必须最后调用endTrace结束。
     *
     * @param traceId 全局唯一的id,如果传入的值为空或者null,系统会自动生成
     * @param traceName 用户自定义的入口标识值,不能为 null, 建议传入能够唯一标识入口的数据,例如用户访问网络的 http url
     */
    static public void startTrace(String traceId, String traceName) {
    }

    /**
     * 开启新的trace,该接口仅提供给最源头的前中间件或自己启动的定时程序调用, 支持配置 rpcId 来开启一个嵌套的调用链。使用该接口时,必须最后调用endTrace结束。
     *
     * @param traceId 全局唯一的id,如果传入的值为空或者null,系统会自动生成
     * @param rpcId 额外指定 rpcId,如果为 null,使用 {@link #ROOT_RPC_ID}
     * @param traceName 用户自定义的入口标识值,不能为 null, 建议传入能够唯一标识入口的数据,例如用户访问网络的 http url
     */
    static public void startTrace(String traceId, String rpcId, String traceName) {
    }

    /**
     * 结束一次跟踪,Threadlocal 变量会被清空,调用了 startTrace 及 startTrace4Top 的必须在finally或者最后调用该接口。
     * @param resultCode
     * @param type
     */
    static public void endTrace(String resultCode, int type) {
    }

    /**
     * 返回当前线程关联的RPC调用上下文。仅供中间件调用。可能返回 NULL。 目前是以 Map 形式用来序列化 RpcContext,以便网络传输时序列化可以兼容新老版本。
     *
     * @see #setRpcContext(Object) 重新还原 RpcContext
     */
    static public Object currentRpcContext() {
    	return null;
    }

    /**
     * 直接取得当前的 RpcContext,用于备份 RPC 调用上下文(不做 Map 转换)
     * @see #setRpcContext(RpcContext_inner) 还原 RpcContext
     */
    public static RpcContext_inner getRpcContext() {
    	return null;
    }

    /**
     * 创建 EagleEye 调用上下文,但是不放置到 ThreadLocal。这是为了支持完全无 ThreadLocal
     * 而特别设置的内部方法,在不依赖 ThreadLocal 的场景使用。
     * @param traceId 输入 null 会自动生成
     * @param rpcId 输入 null 会使用 {@link #MAL_ROOT_RPC_ID} 代替
     */
    public static RpcContext_inner createRootRpcContext(String traceId, String rpcId) {
    	return new RpcContext_inner(traceId, rpcId);
    }

    /**
     * 从 Map 中还原 EagleEye 调用上下文,但是不放置到 ThreadLocal。
     * 这是为了支持完全无 ThreadLocal 而特别设置的内部方法,在不依赖 ThreadLocal 的场景使用。
     * @param map
     * @return 如果找不到 TraceId、RpcId 等关键上下文,返回 null
     * @see RpcContext_inner#toMap()
     */
    public static RpcContext_inner createRpcContextFromMap(Map map) {
    	return RpcContext_inner.fromMap(map);
    }

    /**
     * 切换当前线程关联的RPC调用上下文。上下文对象可以是 {@link #getRpcContext()} 的返回值, 也可以是 {@link #currentRpcContext()} 的返回值。
     *
     * @param rpcCtx RPC调用上下文,可以为null,表示清空当前Threadlocal变量, 该接口不允许业务方调用,只允许 rpc 层调用。
     * @see #getRpcContext() 直接获取 RpcContext 对象,不做 Map 转换
     * @see #currentRpcContext() 获取用于序列化、网络传输的 RpcContext 对象
     */
    static public void setRpcContext(Object rpcCtx) {
    }

    /**
     * @param context 通过传入context,设置threadlocal变量
     * @see #getRpcContext() 直接获取 RpcContext 对象
     */
    public static void setRpcContext(RpcContext_inner context) {
    }

    /**
     * 清理全部调用上下文信息
     */
    static public void clearRpcContext() {
    }

    /**
     * 提交调用上下文,生成日志。这是一个为了提高中间件埋点性能而特别设置的内部方法,
     * 在不依赖 ThreadLocal 的场景使用。
     * @param ctx
     */
    public static void commitRpcContext(RpcContext_inner ctx) {
    }

    /**
     * 从栈上弹出一层 RpcContext,用于客户端 Send/Recv 异步时主逻辑
     * 需要把 send 的子 RpcContext 弹出的场景
     * @return 弹出的当前子 RpcContext
     * @see #rpcClientRecv(String, int, String) 类似用法,但不记日志
     */
    public static RpcContext_inner popRpcContext() {
		RpcContext_inner ctx = RpcContext_inner.get();
		if (null == ctx) {
			return null;
		}
		RpcContext_inner.set(ctx.getParentRpcContext());
		return ctx;
    }

    /**
     * 将本次调用的参数、业务对象输出到日志中,默认路径为 ~/logs/eagleeye/trace-atp.log。 需要透传标记 dump=1 存在,才会进行业务对象的输出
     *
     * @param appId 应用标识
     * @param operationKey 业务操作字段,或调用的服务名、方法名
     * @param obj 业务返回值,或业务对象,可以输入 null,或者 {@link Void#TYPE}
     * @param params 业务参数列表,可以为空
     */
    static public void dump(String appId, String operationKey, Object obj, Object... params) {
    }

    /**
     * 将本次调用的参数、业务对象输出到日志中,默认路径为 ~/logs/eagleeye/trace-atp.log。 这个方法不管透传标记 dump 是否存在,都会进行业务对象的输出,请务必注意不要频繁使用,
     * 否则可能产生大量日志
     *
     * @param appId 应用标识
     * @param operationKey 业务操作字段,或调用的服务名、方法名
     * @param obj 业务返回值,或业务对象,可以输入 null,或者 {@link Void#TYPE}
     * @param params 业务参数列表,可以为空
     * @see #dump(String,String,Object,Object) 仅存在 dump 标记时才输出的 API
     */
    static public void dumpImportant(String appId, String operationKey, Object obj, Object... params) {
    }

    /**
     * 创建一次的RPC调用
     *
     * @param serviceName 服务名称
     * @param methodName 方法名称
     */
    static public void startRpc(String serviceName, String methodName) {
    }

    /**
     * 开始一次本地调用(通常用于标明一段本地调用的开始和结束,不建议大量使用)
     *
     * @param serviceName 服务名称
     * @param methodName 方法名称
     */
    static public void startLocal(String serviceName, String methodName) {
    }

    /**
     * 本地调用结束
     *
     * @resultCode 用于表明成功还是失败,code由业务自己定义 如果只有成功和失败,可以使用RPC_RESULT_SUCCESS以及RPC_RESULT_FAILED
     * @param appendMsg 客户端日志追加的信息, 不能有回车换行等符号
     */
    static public void endLocal(String resultCode, String appendMsg) {
    }

	/**
	 * 本地调用结束,设置调用状态、业务状态码,以及追加的信息
	 *
	 * @param resultCode 设置调用状态码,一般用 RPC_RESULT_SUCCESS 表示正常,RPC_RESULT_FAILED 表示错误
	 * @param bizResultCode 设置业务状态码
     * @param appendMsg 客户端日志追加的信息, 不能有回车换行等符号,可以为 null
	 */
	public static void endLocal(String resultCode, String bizResultCode, String appendMsg) {
	}

    /**
     * 记录客户端发出RPC调用的事件
     */
    static public void rpcClientSend() {
    }

    /**
     * 记录客户端收到RPC响应的事件
     *
     * @param resultCode参考 RPC_RESULT_开头的结果码。有响应表示RPC成功,但业务上有可能还是失败,因此有不同的结果码。
     * @param type 类型为:TYPE_TRACE,TYPE_HSF_CLIENT,TYPE_TDDL,TYPE_NOTIFY,TYPE_TAIR,TYPE_SEARCH
     */
    static public void rpcClientRecv(String resultCode, int type) {
    }

    /**
     * 记录客户端收到RPC响应的事件
     *
     * @param resultCode参考 RPC_RESULT_开头的结果码。有响应表示RPC成功,但业务上有可能还是失败,因此有不同的结果码。
     * @param type 类型为: TYPE_TRACE, TYPE_HSF_CLIENT,TYPE_TDDL,TYPE_NOTIFY,TYPE_TAIR,TYPE_SEARCH
     * @param appendMsg 客户端日志追加的信息, 不能有回车、换行、“|” 等符号
     */
    static public void rpcClientRecv(String resultCode, int type, String appendMsg) {
    }

    /**
     * 服务端收到RPC请求
     */
    static public void rpcServerRecv(String service, String method) {
    }

    /**
     * 服务端返回RPC响应,指定 rpc 类型,Threadlocal变量会被清空
     *
     * @param resultCode参考 RPC_RESULT_开头的结果码。有响应表示RPC成功,但业务上有可能还是失败,因此有不同的结果码。
     * @param type 类型为: TYPE_HSF_SERVER,TYPE_NOTIFY
     */
    static public void rpcServerSend(String resultCode, int type) {
    }

    /**
     * 服务端返回RPC响应,指定 rpc 类型,Threadlocal变量会被清空
     *
     * @param resultCode参考 RPC_RESULT_开头的结果码。有响应表示RPC成功,但业务上有可能还是失败,因此有不同的结果码。
     * @param type类型为: TYPE_TRACE, TYPE_HSF_CLIENT,TYPE_TDDL,TYPE_NOTIFY,TYPE_TAIR,TYPE_SEARCH
     * @param appendMsg客户端日志追加的信息, 不能有回车、换行、“|” 等符号
     */
    static public void rpcServerSend(String resultCode, int type, String appendMsg) {
    }

    /**
     * 获取全局唯一的Traceid
     *
     * @return
     */
    static public String getTraceId() {
    	return null;
    }

    /**
     * 获取当前rpc调用层次
     *
     * @return
     */
    static public String getRpcId() {
    	return null;
    }

    /**
     * 获取当前localId
     *
     * @return 如果没有本地方法则返回""
     */
    static public String getLocalId() {
    	return null;
    }

    /**
     * rpc 上追加的key value信息,会打印到当前 rpc 日志中。 与添加业务信息的 {@link #putUserData(String,String)} 不同, attribute 不会跟随 rpc
     * 调用传递,只对本地当前的这一次 RPC 有效
     *
     * @param key
     * @param value
     * @see #putUserData(String,String)
     */
    static public void attribute(String key, String value) {
    }

    /**
     * 获取随 EagleEye 通过 RPC 透传的业务信息
     *
     * @param key 不能为空
     * @return
     */
    static public String getUserData(String key) {
    	return null;
    }

    /**
     * 放置 key 对应的业务信息,这个信息会打印到当前 rpc 的日志之中。 信息会随 EagleEye 通过 RPC 中间件传递。 数据在调用链里面的从父往子间传递。
     * 如果仅仅希望添加业务信息,不需要信息被传递,可以使用 {@link #attribute(String,String)}
     *
     * @param key 不能为空
     * @param value 值,不能有回车、换行、“|” 等符号
     * @return 原来的值
     */
    static public String putUserData(String key, String value) {
    	return null;
    }

    /**
     * 清除 key 对应的业务信息
     *
     * @param key 不能为空
     * @return 原来的值
     */
    static public String removeUserData(String key) {
    	return null;
    }

    /**
     * 获取随 EagleEye 通过 HSF、Notify 等中间件传递的业务信息。 供内部使用,业务应该使用 {@link #getUserData(String)}
     */
    static public Map getUserDataMap() {
    	return null;
    }

    /**
     * 导出业务信息,供中间件传输 EagleEye 上下文时使用。
     */
    static public String exportUserData() {
    	return null;
    }

    /**
     * 用于业务方希望追加相关数据到rpc调用链中,比如想把业务的方法中的某个参数值打印出来,放到rpc的日志中。
     *
     * @param msg 用户希望追加的内容,不能有回车、换行、“|” 等符号
     */
    static public void callBack(String msg) {
    }

    /**
     * rpc请求大小
     *
     * @param size
     */
    static public void requestSize(long size) {
    }

    /**
     * 追加远程服务地址
     *
     * @param remoteIp 远程机器ip地址
     */
    static public void remoteIp(String remoteIp) {
    }

    /**
     * rpc响应的大小
     *
     * @param size
     */
    static public void responseSize(long size) {
    }

    /**
     * 支持业务重新设置 URL (traceName),同时重新指定 iToken
     *
     * @param traceName 新的 URL,如果为 null,则不设置 traceName
     * @param iToken 新的 iToken 标记,如果为 null,则按当前 traceName 自动生成
     */
    static public void traceName(String traceName, String iToken) {
    }

    /**
     * 设置调用的状态码,注意:如果显式调用了这个 API,传入了非空值,那么
     * {@link #endTrace(String, int)}、{@link #rpcClientRecv(String, int)}、
     * {@link #rpcServerSend(String, int)} 设置的 resultCode 都会被忽略
     * @param resultCode
     * @see #bizResultCode(String) 仅设置业务的状态码
     * @see #bizErrorCode(String) 设置业务的状态码,且设置调用的状态码为错误
     */
    public static void resultCode(String resultCode) {
    }

    /**
	 * 设置业务的状态码(不要有可变参数在里面,因为要进行统计),
	 * 同时,将这次调用的状态码设置为业务错误
     * @param bizErrorCode
     * @see #bizResultCode(String) 仅设置业务的状态码
     * @see #resultCode(String) 仅设置调用的状态码
     */
    public static void bizErrorCode(String bizErrorCode) {
    }

    /**
	 * 设置业务的状态码(不要有可变参数在里面,因为要进行统计),
	 * 不会影响调用的状态码(默认的调用状态码是“正常”)
	 * @param bizResultCode
     * @see #resultCode(String) 仅设置调用的状态码
     * @see #bizErrorCode(String) 设置业务的状态码,且设置调用的状态码为错误
     */
    public static void bizResultCode(String bizResultCode) {
    }

    /**
     * 生成全局唯一的traceid
     *
     * @param ip 用户出入的ip地址,如果非法或者为空,则使用当前机器的ip地址
     * @return
     */
    static public String generateTraceId(String ip) {
    	return null;
    }

    /**
     * 当 RpcId 在多播情况下(例如一对多的 RPC 调用),调用这个方法产生新的 RPC Id
     *
     * @param rpcId 当前的 RPC Id
     * @param identifier 保留用(如果有比 ip 更适合的标识符,可以允许外部指定
     * @return
     */
    static public String generateMulticastRpcId(String rpcId, String identifier) {
    	return null;
    }

    /**
     * 索引服务,该日志会记录在eagleeye日志中,目的是对大量重复的消息做编码。
     *
     * @param msg 需要编码的消息
     * @return
     */
    static public String index(String msg) {
    	return null;
    }

    /**
     * 注册监听上下文变化的回调
     * @param listener
     */
    public static void addRpcContextListener(EagleEyeContextListener listener) {
    }

    /**
     * 反注册上下文变化的回调
     * @param listener
     */
    public static boolean removeRpcContextListener(EagleEyeContextListener listener) {
    	return false;
    }

    /**
     * 记录 EagleEye 自身信息时使用,EagleEye 内部调试用
     */
    public static void selfLog(String log) {
    }

    /**
     * 记录 EagleEye 自身错误异常时使用,EagleEye 内部调试用
     */
    public static void selfLog(String log, Throwable e) {
    }

    /**
     * 触发 EagleEye 组件的初始化
     */
    public static void init() {
    }

    /**
     * 强制刷新缓存中的日志内容到文件中去,一般建议外部在程序结束阶段时调用, 使用中频繁调用会导致性能下降
     */
    static public void flush() {
    }

    /**
     * 停止 EagleEye 相关的活动线程,停止后 StatLogger 以及使用了异步处理的日志输出都会不可用
     */
    public static void shutdown() {
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy