// Path: src/main/java/com/yiji/falcon/agent/plugins/util/PluginActivateType.java
// public enum  PluginActivateType {
//     /**
//      * 插件不运行
//      */
//     DISABLED("不启用"),
//     /**
//      * 无论服务是否运行,都启动插件
//      */
//     FORCE("强制启动"),
//     /**
//      * 当监控服务可用时,自动进行插件启动
//      */
//     AUTO("自动运行");
// 
//     /**
//      * 活动描述
//      */
//     private String desc;
// 
//     PluginActivateType(String desc) {
//         this.desc = desc;
//     }
// 
//     public String getDesc() {
//         return desc;
//     }
// }
// 
// Path: src/main/java/com/yiji/falcon/agent/util/StringUtils.java
// public class StringUtils {
// 
//     /**
//      * 判断传入的String是否为空('' or null)
//      * @param str
//      * @return
//      */
//     public static boolean isEmpty(String str){
//         return str == null || str.length() == 0;
//     }
// 
//     /**
//      * 返回指定数字的字符串形式
//      * @param value
//      * @return
//      */
//     public static String getStringByInt(int value){
//         return String.valueOf(value).intern();
//     }
// 
// }
// 
// Path: src/main/java/com/yiji/falcon/agent/vo/detect/DetectResult.java
// @Data
// public class DetectResult {
// 
//     /**
//      * 探测结果,Agent将根据此属性进行探测地址的可用性上报
//      */
//     private boolean success;
// 
//     /**
//      * 自定义的监控值
//      * Agent会将此Map中的key当做metrics名称,{@link com.yiji.falcon.agent.vo.detect.DetectResult.Metric} 对象组建上报值进行上报
//      */
//     private List<Metric> metricsList;
// 
// 
//     /**
//      * 自定义的公共的tag信息
//      * 形如tag1={tag1},tag2={tag2}
//      * 设置后,将会对每个监控值都会打上此tag
//      */
//     private String commonTag;
// 
//     @ToString
//     public static class Metric{
//         /**
//          * 自定义监控名
//          */
//         public String metricName;
//         /**
//          * 自定义监控值的value
//          */
//         public String value;
//         /**
//          * 自定义监控值的上报类型
//          */
//         public CounterType counterType;
//         /**
//          * 自定义监控值的tag
//          */
//         public String tags;
// 
//         /**
//          * @param metricName
//          * @param value
//          * @param counterType
//          * @param tags
//          */
//         public Metric(String metricName,String value, CounterType counterType, String tags) {
//             this.metricName = metricName;
//             this.value = value;
//             this.counterType = counterType;
//             this.tags = tags;
//         }
//     }
// }


import com.yiji.falcon.agent.plugins.util.PluginActivateType;
import com.yiji.falcon.agent.util.StringUtils;
import com.yiji.falcon.agent.vo.detect.DetectResult;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
/*
 * www.yiji.com Inc.
 * Copyright (c) 2016 All Rights Reserved
 */
package com.yiji.falcon.agent.plugins;
/*
 * 修订记录:
 * guqiu@yiji.com 2016-07-21 14:57 创建
 */



/**
 * 探测监控插件
 * @author guqiu@yiji.com
 */
public interface DetectPlugin extends Plugin {

    /**
     * 监控的具体服务的agentSignName tag值
     * @param address
     * 被监控的探测地址
     * @return
     * 根据地址提炼的标识,如域名等
     */
    String agentSignName(String address);

    /**
     * 一次地址的探测结果
     * @param address
     * 被探测的地址,地址来源于方法 {@link com.yiji.falcon.agent.plugins.DetectPlugin#detectAddressCollection()}
     * @return
     * 返回被探测的地址的探测结果,将用于上报监控状态
     */
    DetectResult detectResult(String address);

    /**
     * 被探测的地址集合
     * @return
     * 只要该集合不为空,就会触发监控
     * pluginActivateType属性将不起作用
     */
    Collection<String> detectAddressCollection();

    /**
     * 无需配置该属性,此类插件pluginActivateType属性将不起作用
     * 运行方式见 {@link com.yiji.falcon.agent.plugins.DetectPlugin#detectAddressCollection()}
     *
     * 插件运行方式
     *
     * @return
     */
    @Override
// Path: src/main/java/com/yiji/falcon/agent/plugins/util/PluginActivateType.java
// public enum  PluginActivateType {
//     /**
//      * 插件不运行
//      */
//     DISABLED("不启用"),
//     /**
//      * 无论服务是否运行,都启动插件
//      */
//     FORCE("强制启动"),
//     /**
//      * 当监控服务可用时,自动进行插件启动
//      */
//     AUTO("自动运行");
// 
//     /**
//      * 活动描述
//      */
//     private String desc;
// 
//     PluginActivateType(String desc) {
//         this.desc = desc;
//     }
// 
//     public String getDesc() {
//         return desc;
//     }
// }
// 
// Path: src/main/java/com/yiji/falcon/agent/util/StringUtils.java
// public class StringUtils {
// 
//     /**
//      * 判断传入的String是否为空('' or null)
//      * @param str
//      * @return
//      */
//     public static boolean isEmpty(String str){
//         return str == null || str.length() == 0;
//     }
// 
//     /**
//      * 返回指定数字的字符串形式
//      * @param value
//      * @return
//      */
//     public static String getStringByInt(int value){
//         return String.valueOf(value).intern();
//     }
// 
// }
// 
// Path: src/main/java/com/yiji/falcon/agent/vo/detect/DetectResult.java
// @Data
// public class DetectResult {
// 
//     /**
//      * 探测结果,Agent将根据此属性进行探测地址的可用性上报
//      */
//     private boolean success;
// 
//     /**
//      * 自定义的监控值
//      * Agent会将此Map中的key当做metrics名称,{@link com.yiji.falcon.agent.vo.detect.DetectResult.Metric} 对象组建上报值进行上报
//      */
//     private List<Metric> metricsList;
// 
// 
//     /**
//      * 自定义的公共的tag信息
//      * 形如tag1={tag1},tag2={tag2}
//      * 设置后,将会对每个监控值都会打上此tag
//      */
//     private String commonTag;
// 
//     @ToString
//     public static class Metric{
//         /**
//          * 自定义监控名
//          */
//         public String metricName;
//         /**
//          * 自定义监控值的value
//          */
//         public String value;
//         /**
//          * 自定义监控值的上报类型
//          */
//         public CounterType counterType;
//         /**
//          * 自定义监控值的tag
//          */
//         public String tags;
// 
//         /**
//          * @param metricName
//          * @param value
//          * @param counterType
//          * @param tags
//          */
//         public Metric(String metricName,String value, CounterType counterType, String tags) {
//             this.metricName = metricName;
//             this.value = value;
//             this.counterType = counterType;
//             this.tags = tags;
//         }
//     }
// }


// Path: src/main/java/com/yiji/falcon/agent/plugins/DetectPlugin.java
import com.yiji.falcon.agent.plugins.util.PluginActivateType;
import com.yiji.falcon.agent.util.StringUtils;
import com.yiji.falcon.agent.vo.detect.DetectResult;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

/*
 * www.yiji.com Inc.
 * Copyright (c) 2016 All Rights Reserved
 */
package com.yiji.falcon.agent.plugins;
/*
 * 修订记录:
 * guqiu@yiji.com 2016-07-21 14:57 创建
 */



/**
 * 探测监控插件
 * @author guqiu@yiji.com
 */
public interface DetectPlugin extends Plugin {

    /**
     * 监控的具体服务的agentSignName tag值
     * @param address
     * 被监控的探测地址
     * @return
     * 根据地址提炼的标识,如域名等
     */
    String agentSignName(String address);

    /**
     * 一次地址的探测结果
     * @param address
     * 被探测的地址,地址来源于方法 {@link com.yiji.falcon.agent.plugins.DetectPlugin#detectAddressCollection()}
     * @return
     * 返回被探测的地址的探测结果,将用于上报监控状态
     */
    DetectResult detectResult(String address);

    /**
     * 被探测的地址集合
     * @return
     * 只要该集合不为空,就会触发监控
     * pluginActivateType属性将不起作用
     */
    Collection<String> detectAddressCollection();

    /**
     * 无需配置该属性,此类插件pluginActivateType属性将不起作用
     * 运行方式见 {@link com.yiji.falcon.agent.plugins.DetectPlugin#detectAddressCollection()}
     *
     * 插件运行方式
     *
     * @return
     */
    @Override
    default PluginActivateType activateType(){