精华内容
下载资源
问答
  • DOWNLOADER_MIDDLEWARES = { 'scrapy_test.middlewares.RandomUserAgent': 100, }
  • zabbix agent

    2019-01-20 12:39:52
    zabbix agent的源码阅读。阅读agent的源码首先要找到agent 的main函数在哪个地⽅。这个 agent的main函数是在zabbix_agentd.c这个⽂件⾥⾯的。打开这个⽂ 件,首先找到main函数。
  • 结合黑板系统及Agent技术,设计基于黑板的多Agent智能决策支持系统模型,同时对该模型中的各Agent功能进行描述。此外,提出系统中Agent的抽象结构,并对Agent的行为进行了描述和建模。该系统有助于多个Agent协同求解...
  • Agent开发文档 Microsoft Agent Version 2.0
  • 在此和大家分享JADE(全称Java Agent DEvelopment Framework)一个很酷的在Java上进行Agent开发的框架。你可以用这个框架很轻易的搭建一个MAS(多智能体系统),在这些系统中,各个Agent是自治的,而且可以互相通信...
  • jmeter 服务资源监控插件放在目标服务器上,ServerAgent监控用的agent,需要监控哪个服务器就放到哪个地方,Linux和window通用,启动端口默认为4444,不用修改。
  • Agent及Multi-Agent系统

    2010-04-13 23:29:18
    7.1 Agent概述 7.2 Agent的理论模型 7.3 Agent的结构 7.4 Agent通信 7.5 Multi-Agent系统 7.6 移动Agent 7.7 面向Agent的程序设计
  • Java Agent

    千次阅读 2019-01-15 20:26:53
    在 Java 字节码 一文中有提到,使用 Java Agent 操控字节码,本文将讨论 Java Agent ,这是普通 Java 开发人员的真正的黑魔法。Java Agent 能够通过执行字节码的直接修改,在运行时 “侵入” JVM 上运行的 Java 应用...

    Java 字节码 一文中有提到,使用 Java Agent 操控字节码,本文将讨论 Java Agent ,这是普通 Java 开发人员的真正的黑魔法。Java Agent 能够通过执行字节码的直接修改,在运行时 “侵入” JVM 上运行的 Java 应用程序的执行。Java Agent 很强大,但是也很危险:它们几乎可以完成所有操作,但是如果出现问题,也很容易导致 JVM 崩溃。
    我们将通过解析 Java Agent 如何工作,如何运行它们以及展示 Java Agent 作为明显优势的一些简单示例来揭开 Java Agent 的神秘面纱。

    1. Java Agent 基础知识

    从本质上讲,Java Agent 是一个遵循一组严格约定的常规 Java 类。代理类必须实现一个 public static void premain(String agentArgs, Instrumentation inst) 成为代理入口点的 main 方法(类似于常规 Java 应用程序的方法)。

    Java 虚拟机(JVM)初始化后,premain(String agentArgs, Instrumentation inst) 将按照在 JVM 启动时指定代理的顺序调用每个代理的每个此类方法。完成此初始化步骤后, main 将调用真正的 Java 应用程序方法。简单来讲,就是 premain 方法,在 main 方法之前执行。

    但是,如果类没有实现 public static void premain(String agentArgs, Instrumentation inst) 方法,JVM 将尝试查找并调用另一个重载版本 public static void premain(String agentArgs) 。注意,每个 premain 方法都必须返回,以便启动阶段继续进行。

    咋一看很简单,但 Java Agent 实现应该提供另外一件事作为其包装的一部分:manifest。通常在 META-INF 文件夹中,名为 MANIFEST.MF,包含于包分发相关的各种元数据。
    点击阅读:Java Agent 官方文档

    2. Java Agent 代理和检测

    Java Agent 的检测功能是无限的。最值得注意的包括但不限于:

    • 能够在运行时重新定义类。
      重新定义可以改变方法体,常量池和属性。重定义不得添加,删除,重命名字段或方法,不得更改方法的签名或更改继承。
    • 能够在运行时重新转换类。
      重新转换可以改变方法体,常量和属性。新转换不得添加,删除,重命名字段或方法,不得更改方法的签名或更改继承。
    • 能够允许使用应用于名称的前缀进行重试来修改本机方法解析的失败处理。

    注意,在应用了转换或重新定义之后,不会检查,验证和安装重新转换或重新定义的类字节码。如果生成的字节码错误或不正确,则会抛出异常,这可能会导致 JVM 完全崩溃。

    3. 编写一个简单的 Java Agent

    我们将通过实现自己的类转换器来编写一个简单的 Java Agent。话虽如此,使用 Java Agent 的唯一缺点是,需要直接的字节码操作技能(如果大家对 Java 字节码 不是很了解,可以参考我的这篇文章: Java 字节码 )。而且,遗憾的是,Java 标准库不提供任何 API来使这些字节码操作成为可能。
    为了填补这一空白,Java 社区提供了一些很成熟的库,比如 Javassist (Javassist 入门)。
    现在,我们着手编写一个示例,我们假设想捕获 Java 应用程序中打开的每个 HTTP 连接的 URL。有很多方法可以通过直接修改 Java 源代码来实现,但让我们假设源代码由于许可证策略或其他原因而不可用。
    为了方便操作 Java 字节码,首先引入 Javassist 的 maven 包:

    <!-- https://mvnrepository.com/artifact/org.javassist/javassist -->
        <dependency>
          <groupId>org.javassist</groupId>
          <artifactId>javassist</artifactId>
          <version>3.24.1-GA</version>
        </dependency>
    

    打开 HTTP 连接的类的典型示例如下所示:

    public class SimpleClass {
        public static void main( String[] args ) throws IOException {
            System.out.println("===========执行main方法=============");
            fetch("http://www.baidu.com");
            fetch("http://www.163.com");
        }
    
        private static void fetch(final String address) throws IOException {
    
            final URL url = new URL(address);
            final URLConnection connection = url.openConnection();
    
            try (final BufferedReader in = new BufferedReader(
                    new InputStreamReader( connection.getInputStream())
            )){
                String inputLine = null;
                final StringBuffer sb = new StringBuffer();
                while ( (inputLine = in.readLine()) != null){
                    sb.append(inputLine);
                }
    
                System.out.println("Content size:" + sb.length());
            }
    
        }
    
    }
    

    Java Agent 非常适合解决此类问题。我们只需要定义变换器,它将 sun.net.www.protocol.http.HttpURLConnection 通过注入代码来稍微修改构造函数。让我们来看看其实现:

    public class SimpleClassTransformer implements ClassFileTransformer {
        @Override
        public byte[] transform(
                ClassLoader loader,
                String className,
                Class<?> classBeingRedefined,
                ProtectionDomain protectionDomain,
                byte[] classfileBuffer) throws IllegalClassFormatException {
            if(className.endsWith("sun/net/www/protocol/http/HttpURLConnection")){
                ClassPool classPool = ClassPool.getDefault();
                CtClass clazz = null;
                try {
                    clazz = classPool.get("sun.net.www.protocol.http.HttpURLConnection");
    
                    CtConstructor[] cs = clazz.getConstructors();
                    for(CtConstructor constructor: cs){
                        constructor.insertAfter("System.out.println(this.getURL());");
                    }
    
                    byte[] byteCode = clazz.toBytecode();
                    clazz.detach();
    
                    return byteCode;
                } catch (NotFoundException | CannotCompileException | IOException e) {
                    e.printStackTrace();
                }
            }
            return null;
        }
    }
    

    定义 premain 方法,将 SimpleClassTransformer 类的实例添加到检测上下文中:

    public class SimpleAgent {
        public static void premain(String agentArgs, Instrumentation inst) {
            System.out.println("=========开始执行premain============");
            SimpleClassTransformer transformer = new SimpleClassTransformer();
            inst.addTransformer(transformer);
    
        }
    }
    

    要完成 Java Agent,还需要提供正确的 MANIFEST.MF,以便 JVM 能够选择正确的类。在 META-INF 目录下找到你的 MANIFEST.MF 文件:

    Manifest-Version: 1.0
    Premain-Class: com.demo.SimpleAgent
    
    

    请注意,冒号后面一定要有空格,最后一行要为空。

    4. 运行 Java Agent

    从命令运行时,可以使用 -javaagent

    -javaagent:<path-to-jar>[=options]
    
    

    类似如下:

    java -javaagent:agent.jar
    

    注意,这是条伪命令,因为 agent.jar 有引用 javassist.jar 包中的内容,想要执行成功还需要调用 javassist.jar,命令如下:

    java -javaagent:agent.jar -jar javassist.jar
    

    运行结果:
    在这里插入图片描述
    下面我们在 IDE 中运行 Java Agent。

    使用 idea:

    在这里插入图片描述
    然后运行 SimpleClass 中的 main 方法。结果如下:
    在这里插入图片描述

    使用 Eclipse:

    在这里插入图片描述
    在这里插入图片描述
    运行结果:
    在这里插入图片描述
    写到这里,突然想到以前公司花了150W买过一个链路监控的产品,就是基于Java Agent 做的,功能很强大。但是需要注意,任何错误或不准确的字节码生成都可能导致JVM崩溃,一把双刃剑,看你怎么用了。

    展开全文
  • Agent概述

    万次阅读 2018-08-27 10:54:44
    参考:... 1. Agent定义 Agent的概念——1977年Carl Hewitt “Viewing Control Structures as Patterns of Passing Messages” Agent一词最早见于M.Minsky于1986年出版的《...

    参考:https://www.cnblogs.com/6DAN_HUST/archive/2010/07/21/1782106.html

    1. Agent定义

    Agent的概念——1977年Carl Hewitt “Viewing Control Structures as Patterns of Passing Messages”

    Agent一词最早见于M.Minsky于1986年出版的《Society of Mind》

     

    广义的Agent包括人类、物理世界的机器人和信息世界的软件机器人。

    狭义的Agent专指信息世界中的软件机器人或称软件Agent

     

    Wooldrige 《Intelligent Agents: Theory and Practice》:

    1) 弱定义

    Agent用来最一般地说明一个软硬件系统,具有四个特性:

    (1)自治性。在无人或其他系统的直接干预下可自主操作,并能控制其行为和内部状态。

    (2)社会性。能够通过某种通信语言与其他Agent(也可能是人)进行交互。

    (3)反应性。感知所处的环境,对环境的变化做出实时的反应,并可通过行为改变环境。

    (4)能动性。不仅仅简单地对环境做出反应,而且可以主动地表现出目标驱动的行为。

     

    2) 强定义

    Agent除具备弱定义中所有特性外,还应具备一些人类才具有的特性,如知识、信念、义务、意图等。

     

    2. Agent类型

    (一) 常用划分

    1) 简单反应式Agent

    简单反应式Agent结构框图

    图1 简单反应式Agent结构框图

     

    2) 内置状态反应式Agent

    内置状态反应式Agent结构框图

    图2 内置状态的反应式Agent结构框图

     

    3) 目标驱动的Agent

    目标驱动的Agent结构框图

    图3 目标驱动的Agent结构框图

     

    4) 效用驱动的Agent

    效用驱动的Agent结构框图

    图4 效用驱动的Agent结构框图

     

    (二) 按问题求解能力划分

    反应型Agent :能响应环境的变化或来自其他Agent的消息。
    慎思型Agent(意图型Agent):能够针对意图和信念进行推理,建立行为计划,并执行这些计划。
    社会性Agent:除具有意图Agent的能力外,还具有关于其他主体的明确模型。

     

    3. Agent的环境

    1) 环境的属性

    环境属性

    图5 环境的属性

     

    可知性:Agent传感设备使它可以了解环境的全部状态。对于完全可知的环境,Agent无需保存内置状态信息。

    确定性:下一步环境的状态可以由当前状态和Agent选择的动作来完全决定。

    阶段性:在一个按时间划分为一个个不相关的阶段的环境里,Agent的执行过程也将划分为一个个阶段。

    静态和动态:如果环境在Agent进行推理的时候就发生改变,就说该环境对于Agent来说是动态的,否则就是静态的。

    连续性:如果系统中只有有限的、区别明显的、清晰定义的知觉对象和动作,就说环境是离散的。

     

    2) 环境程序(环境模拟器)

    procedure RUN-ENVIRONMENT(state,UPDATE-FN,Agents,termination)
    inputs:state,the initial state of the environment
    UPDATE-FN,function to modify the environment
    Agents,a set of Agents
    termination,a predicate to test when we are done
    repeat
    for each Agent in Agents do
    PERCEPT[Agent]GET_PERCEPT(Agent, state)
    end
    for each Agent in Agents do
    ACTION[Agent]PROGRAM[Agent](PERCEPT[Agent])
    end
    state UPDATE-FN(actions, Agents, state)
    until termination(state)

     

    参考文献:

    [1] 王汝传, 徐小龙, 黄海平等. 智能Agent及其在信息网络中的应用. 北京: 北京邮电大学出版社

    展开全文
  • 初探zabbix_agent2 plugin

    万次阅读 2021-04-26 01:09:38
    zabbix_agent2作为可以完全替代zabbix_agent功能的客户端,较以往的功能非常强大。 采用go语言进行编写,插件化方式对监控的能力进行管理。 一栈式代理能力,官方提供的5.2版本已经具有很强的监控能力 zabbix_agent...

    概述

    • zabbix_agent2作为可以完全替代zabbix_agent功能的客户端,较以往的功能非常强大。
    • 采用go语言进行编写,插件化方式对监控的能力进行管理。
    • 一栈式代理能力,官方提供的5.2版本已经具有很强的监控能力

    zabbix_agent2指标

    • 在代理运行的情况下,我们可以执行zabbix_agent2 -R metrics 获取当前代理所支持的指标,以及指标的运行情况
    [Agent]
    active: true
    capacity: 0/100
    tasks: 0
    agent.hostname: Returns Hostname from agent configuration.
    agent.ping: Returns agent availability check result.
    agent.version: Version of Zabbix agent.
    
    [Ceph]
    active: false
    capacity: 0/100
    tasks: 0
    ceph.df.details: Returns information about cluster’s data usage and distribution among pools.
    ceph.osd.discovery: Returns a list of discovered OSDs.
    ceph.osd.dump: Returns usage thresholds and statuses of OSDs.
    ceph.osd.stats: Returns aggregated and per OSD statistics.
    ceph.ping: Tests if a connection is alive or not.
    ceph.pool.discovery: Returns a list of discovered pools.
    ceph.status: Returns an overall cluster's status.
    
    [Cpu]
    active: true
    capacity: 0/100
    tasks: 12
    system.cpu.discovery: List of detected CPUs/CPU cores, used for low-level discovery.
    system.cpu.num: Number of CPUs.
    system.cpu.util: CPU utilisation percentage.
    
    [Docker]
    active: false
    capacity: 0/100
    tasks: 0
    docker.container_info: Return low-level information about a container.
    docker.container_stats: Returns near realtime stats for a given container.
    docker.containers: Returns a list of containers.
    docker.containers.discovery: Returns a list of containers, used for low-level discovery.
    docker.data_usage: Returns information about current data usage.
    docker.images: Returns a list of images.
    docker.images.discovery: Returns a list of images, used for low-level discovery.
    docker.info: Returns information about the docker server.
    docker.ping: Pings the server and returns 0 or 1.
    
    [File]
    active: true
    capacity: 0/100
    tasks: 3
    vfs.file.cksum: Returns File checksum, calculated by the UNIX cksum algorithm.
    vfs.file.contents: Retrieves contents of the file.
    vfs.file.exists: Returns if file exists or not.
    vfs.file.md5sum: Returns MD5 checksum of file.
    vfs.file.regexp: Find string in a file.
    vfs.file.regmatch: Find string in a file.
    vfs.file.size: Returns file size.
    vfs.file.time: Returns file time information.
    
    [Kernel]
    active: true
    capacity: 0/100
    tasks: 2
    kernel.maxfiles: Returns maximum number of opened files supported by OS.
    kernel.maxproc: Returns maximum number of processes supported by OS.
    
    [Log]
    active: false
    capacity: 0/100
    tasks: 0
    log: Log file monitoring.
    log.count: Count of matched lines in log file monitoring.
    logrt: Log file monitoring with log rotation support.
    logrt.count: Count of matched lines in log file monitoring with log rotation support.
    
    [MQTT]
    active: false
    capacity: 0/100
    tasks: 0
    mqtt.get: Subscribe to MQTT topics for published messages.
    
    [Memcached]
    active: false
    capacity: 0/100
    tasks: 0
    memcached.ping: Test if connection is alive or not.
    memcached.stats: Returns output of stats command.
    
    [Memory]
    active: true
    capacity: 0/100
    tasks: 3
    vm.memory.size: Returns memory size in bytes or in percentage from total.
    
    [Modbus]
    active: false
    capacity: 0/100
    tasks: 0
    modbus.get: Returns a JSON array of the requested values, usage: modbus.get[endpoint,<slave id>,<function>,<address>,<count>,<type>,<endianness>,<offset>].
    
    [Mongo]
    active: false
    capacity: 0/100
    tasks: 0
    mongodb.cfg.discovery: Returns a list of discovered config servers.
    mongodb.collection.stats: Returns a variety of storage statistics for a given collection.
    mongodb.collections.discovery: Returns a list of discovered collections.
    mongodb.collections.usage: Returns usage statistics for collections.
    mongodb.connpool.stats: Returns information regarding the open outgoing connections from the current database instance to other members of the sharded cluster or replica set.
    mongodb.db.discovery: Returns a list of discovered databases.
    mongodb.db.stats: Returns statistics reflecting a given database system’s state.
    mongodb.jumbo_chunks.count: Returns count of jumbo chunks.
    mongodb.oplog.stats: Returns a status of the replica set, using data polled from the oplog.
    mongodb.ping: Test if connection is alive or not.
    mongodb.rs.config: Returns a current configuration of the replica set.
    mongodb.rs.status: Returns a replica set status from the point of view of the member where the method is run.
    mongodb.server.status: Returns a database’s state.
    mongodb.sh.discovery: Returns a list of discovered shards present in the cluster.
    
    [Mysql]
    active: false
    capacity: 0/100
    tasks: 0
    mysql.db.discovery: Returns list of databases in LLD format.
    mysql.db.size: Returns size of given database in bytes.
    mysql.get_status_variables: Returns values of global status variables.
    mysql.ping: Tests if connection is alive or not.
    mysql.replication.discovery: Returns replication information in LLD format.
    mysql.replication.get_slave_status: Returns replication status.
    mysql.version: Returns MySQL version.
    
    [NetIf]
    active: true
    capacity: 0/100
    tasks: 7
    net.if.collisions: Returns number of out-of-window collisions.
    net.if.discovery: Returns list of network interfaces. Used for low-level discovery.
    net.if.in: Returns incoming traffic statistics on network interface.
    net.if.out: Returns outgoing traffic statistics on network interface.
    net.if.total: Returns sum of incoming and outgoing traffic statistics on network interface.
    
    [Oracle]
    active: false
    capacity: 0/100
    tasks: 0
    oracle.archive.discovery: Returns list of archive logs in LLD format.
    oracle.archive.info: Returns archive logs statistics.
    oracle.cdb.info: Returns CDBs info.
    oracle.custom.query: Returns result of a custom query.
    oracle.datafiles.stats: Returns data files statistics.
    oracle.db.discovery: Returns list of databases in LLD format.
    oracle.diskgroups.discovery: Returns list of ASM disk groups in LLD format.
    oracle.diskgroups.stats: Returns ASM disk groups statistics.
    oracle.fra.stats: Returns FRA statistics.
    oracle.instance.info: Returns instance stats.
    oracle.pdb.discovery: Returns list of PDBs in LLD format.
    oracle.pdb.info: Returns PDBs info.
    oracle.pga.stats: Returns PGA statistics.
    oracle.ping: Tests if connection is alive or not.
    oracle.proc.stats: Returns processes statistics.
    oracle.redolog.info: Returns log file information from the control file.
    oracle.sessions.stats: Returns sessions statistics.
    oracle.sga.stats: Returns SGA statistics.
    oracle.sys.metrics: Returns a set of system metric values.
    oracle.sys.params: Returns a set of system parameter values.
    oracle.ts.discovery: Returns list of tablespaces in LLD format.
    oracle.ts.stats: Returns tablespaces statistics.
    oracle.user.info: Returns user information.
    
    [Postgres]
    active: false
    capacity: 0/100
    tasks: 0
    pgsql.archive: Returns info about size of archive files.
    pgsql.autovacuum.count: Returns count of autovacuum workers.
    pgsql.bgwriter: Returns JSON for sum of each type of bgwriter statistic.
    pgsql.cache.hit: Returns cache hit percent.
    pgsql.connections: Returns JSON for sum of each type of connection.
    pgsql.custom.query: Returns result of a custom query.
    pgsql.db.age: Returns age for specific database.
    pgsql.db.bloating_tables: Returns percent of bloating tables for each database.
    pgsql.db.discovery: Returns JSON discovery rule with names of databases.
    pgsql.db.size: Returns size in bytes for specific database.
    pgsql.dbstat: Returns JSON for sum of each type of statistic.
    pgsql.dbstat.sum: Returns JSON for sum of each type of statistic for all database.
    pgsql.locks: Returns collect all metrics from pg_locks.
    pgsql.oldest.xid: Returns age of oldest xid.
    pgsql.ping: Tests if connection is alive or not.
    pgsql.replication.count: Returns number of standby servers.
    pgsql.replication.lag.b: Returns replication lag with Master in byte.
    pgsql.replication.lag.sec: Returns replication lag with Master in seconds.
    pgsql.replication.process: Returns flush lag, write lag and replay lag per each sender process.
    pgsql.replication.process.discovery: Returns JSON with application name from pg_stat_replication.
    pgsql.replication.recovery_role: Returns postgreSQL recovery role.
    pgsql.replication.status: Returns postgreSQL replication status.
    pgsql.uptime: Returns uptime.
    pgsql.wal.stat: Returns JSON wal by type.
    
    [Proc]
    active: false
    capacity: 0/100
    tasks: 0
    proc.cpu.util: Process CPU utilization percentage.
    
    [ProcExporter]
    active: false
    capacity: 0/100
    tasks: 0
    proc.mem: Process memory utilization values.
    
    [Redis]
    active: false
    capacity: 0/100
    tasks: 0
    redis.config: Returns configuration parameters of Redis server.
    redis.info: Returns output of INFO command.
    redis.ping: Test if connection is alive or not.
    redis.slowlog.count: Returns the number of slow log entries since Redis has been started.
    
    [Smart]
    active: false
    capacity: 0/100
    tasks: 0
    smart.attribute.discovery: Returns JSON array of smart device attributes.
    smart.disk.discovery: Returns JSON array of smart devices.
    smart.disk.get: Returns JSON data of smart device.
    
    [Sw]
    active: true
    capacity: 0/100
    tasks: 1
    system.sw.packages: Lists installed packages whose name matches the given package regular expression.
    
    [Swap]
    active: true
    capacity: 0/100
    tasks: 3
    system.swap.size: Returns Swap space size in bytes or in percentage from total.
    
    [SystemRun]
    active: false
    capacity: 0/100
    tasks: 0
    system.run: Run specified command.
    
    [Systemd]
    active: false
    capacity: 0/100
    tasks: 0
    systemd.unit.discovery: Returns JSON array of discovered units, usage: systemd.unit.discovery[<type>].
    systemd.unit.get: Returns the bulked info, usage: systemd.unit.get[unit,<interface>].
    systemd.unit.info: Returns the unit info, usage: systemd.unit.info[unit,<parameter>,<interface>].
    
    [TCP]
    active: false
    capacity: 0/100
    tasks: 0
    net.tcp.port: Checks if it is possible to make TCP connection to specified port.
    net.tcp.service: Checks if service is running and accepting TCP connections.
    net.tcp.service.perf: Checks performance of TCP service.
    
    [UDP]
    active: false
    capacity: 0/100
    tasks: 0
    net.udp.service: Checks if service is running and responding to UDP requests.
    net.udp.service.perf: Checks performance of UDP service.
    
    [Uname]
    active: true
    capacity: 0/100
    tasks: 3
    system.hostname: Returns system host name.
    system.sw.arch: Software architecture information.
    system.uname: Returns system uname.
    
    [Uptime]
    active: true
    capacity: 0/100
    tasks: 1
    system.uptime: Returns system uptime in seconds.
    
    [Users]
    active: true
    capacity: 0/100
    tasks: 1
    system.users.num: Returns number of useres logged in.
    
    [VFSDev]
    active: true
    capacity: 0/100
    tasks: 2
    vfs.dev.discovery: List of block devices and their type. Used for low-level discovery.
    vfs.dev.read: Disk read statistics.
    vfs.dev.write: Disk write statistics.
    
    [VfsFs]
    active: true
    capacity: 0/100
    tasks: 13
    vfs.fs.discovery: List of mounted filesystems. Used for low-level discovery.
    vfs.fs.get: List of mounted filesystems with statistics.
    vfs.fs.inode: Disk space in bytes or in percentage from total.
    vfs.fs.size: Disk space in bytes or in percentage from total.
    
    [Web]
    active: false
    capacity: 0/100
    tasks: 0
    web.page.get: Get content of a web page.
    web.page.perf: Loading time of full web page (in seconds).
    web.page.regexp: Find string on a web page.
    
    [ZabbixAsync]
    active: true
    capacity: 0/100
    tasks: 7
    net.tcp.listen: Checks if this TCP port is in LISTEN state.
    net.udp.listen: Checks if this UDP port is in LISTEN state.
    sensor: Hardware sensor reading.
    system.boottime: Returns system boot time.
    system.cpu.intr: Device interrupts.
    system.cpu.load: CPU load.
    system.cpu.switches: Count of context switches.
    system.hw.cpu: CPU information.
    system.hw.macaddr: Listing of MAC addresses.
    system.localtime: Returns system local time.
    system.sw.os: Operating system information.
    system.swap.in: Swap in (from device into memory) statistics.
    system.swap.out: Swap out (from memory onto device) statistics.
    
    [ZabbixStats]
    active: false
    capacity: 0/100
    tasks: 0
    zabbix.stats: Return a set of Zabbix server or proxy internal metrics or return number of monitored items in the queue which are delayed on Zabbix server or proxy.
    
    [ZabbixSync]
    active: true
    capacity: 0/1
    tasks: 2
    net.dns: Checks if DNS service is up.
    net.dns.record: Performs DNS query.
    proc.num: The number of processes.
    system.hw.chassis: Chassis information.
    system.hw.devices: Listing of PCI or USB devices.
    vfs.dir.count: Directory entry count.
    vfs.dir.size: Directory size (in bytes).
    
    • 从以上可以看到,按照组,zabbix_agent2代理已经支持很多种类型的软件,并且这些以插件的形式进行管理,在未启用的情况下,处于未激活状态,并不消耗资源,只有关联到的模板监控项时,才会进行启用。
    • 预计未来zabbix_agent2的插件会整合更多的软件监控解决方案

    打造一个简易插件

    • 通过官方文档,我们可以了解到如何去打造一个属于自己的一个插件。相关文档资料链接https://www.zabbix.com/documentation/current/manual/config/items/plugins
      官方文档中的一个示例有明显错误,返回值不满足函数定义
      在这里插入图片描述
    • 一个插件至少要继承一个或多个插件接口(Exporter, Collector, Runner, Watcher),我们选择最简单的一种方式,Exporter
    • 根据官方文档,我们需要定义一个Plugin结构体,包含plugin.Base,并且实现Export方法,代码如下:
    type Plugin struct {
    	plugin.Base
    }
    
    var impl Plugin
    
    func (p *Plugin) Export(key string, params []string, ctx plugin.ContextProvider) (result interface{}, err error) {
    	switch key {
    	case "system.mytime":
    		if len(params) > 0 {
    			p.Debugf("received %d parameters while expected none", len(params))
    			return nil, errors.New("Too many parameters")
    		}
    		return time.Now().Format(time.RFC3339), nil
    	case "system.echo":
    		return params[0], nil
    	default:
    		return nil, plugin.UnsupportedMetricError
    	}
    }
    

    这里解释一下,这里的key就是监控项,params就是监控项所允许的参数内容,如我上述代码,当监控项为"system.mytime"时,如果带有参数,则会报错。当监控项为"system.echo"时,则会回显出第一个参数值出来,这里并没有对参数内容做判断,当参数长度为0时,会引发错误,所以在实际项目时,建议完善参数配置,并给出配置文档。

    • 注册指标,通过包名的init函数,自动初始化注册指标,代码如下
    func init() {
    	plugin.RegisterMetrics(&impl, "myTime",
    		"system.mytime", "Returns time string in RFC 3999 format.",
    		"system.echo","Echo what you type in!")
    }
    

    impl为包里面定义的一个插件变量,myTime是属性组,注册指标时,需要注意要把监控项和描述一对一对的注册,否则会引发运行时错误。
    另外描述必须以大写字母开头,以英文句点结束,否则将引发运行时异常,无法启动代理,将出现如下报错。

    panic: cannot register metric "system.echo" without dot at the end of description: "Just for test!"
    panic: cannot register metric "system.echo" with description without capital first letter: "just for test!"
    
    • 添加插件
      找到插件添加文件plugins_linux.go
      添加我们自己新建的插件目录,即可完成插件的添加
    _ "zabbix.com/plugins/yeqing/mydemo"
    

    编译安装

    • 整个编译过程跟官方使用源码方式部署一致,这里不再赘述。

    验证

    • 我们可以通过zabbix_agent2 -R metrics 来检查是否已经包含了我们的插件
    [myTime]
    active: true
    capacity: 0/100
    tasks: 1
    system.echo: Just for test.
    system.mytime: Returns time string in RFC 3999 format.
    

    我们可以看到已经有了自己编写的插件了

    • 使用监控项验证
    ./zabbix_agent2 -t system.echo[xx,dd,dd]
    system.echo[xx,dd,dd]                         [s|xx]
    

    可以看到,已经按照我们的要求,返回对应的内容了

    • 监控项验证
      在zabbix中增加一个监控项,从zabbix前端查看数据
      在这里插入图片描述

    总结

    • zabbix_agent2确实很强大,通过go语言,很轻松就可以实现插件的编写,使监控更加灵活,强大。
    展开全文
  • 删除新版UniAccess Agent 办公室监控软件,右击以管理员身份运行一键删除 UniAccess Agent Version: 3.5.8052.2
  • Java Agent 调试,Java agent debug

    千次阅读 2020-02-02 16:24:11
    Java Agent 调试,agent debug 一、简介 Java agent 是在另外一个 Java 应用(“目标”应用)启动之前要执行的 Java 程序,这样 agent 就有机会修改目标应用或者应用所运行的环境。修改环境的时候做到对于项目中的...

    Java Agent 调试,agent debug

    一、简介

    Java agent 是在另外一个 Java 应用(“目标”应用)启动之前要执行的 Java 程序,这样 agent 就有机会修改目标应用或者应用所运行的环境。修改环境的时候做到对于项目中的代码没有入侵性,不需要修改老项目代码即可实现想要的能力,比如常见的skywoking,就是通过这样的方式实现的。比如这篇文章 通过修改字节码实现Java Agent 通过使用 Byte Buddy,便捷地创建 Java Agent 。还有一些功能,比如热更新、arthas 替换class字节码等等。

    问题

    • Java agent的实现原理是什么?
    • Java agent 如何调试呢?习惯了现在的直接代码调试?对于agent 有点慌。

    二、原理

    Java agent 主要是通过Instrumentation实现的。

    Instrumentation

    简介

    java.lang.instrument 做动态 Instrumentation 是 Java SE 5 的新特性,它把 Java 的 instrument 功能从本地代码中解放出来,使之可以用 Java 代码的方式解决问题。使用 Instrumentation,开发者可以构建一个独立于应用程序的代理程序(Agent),用来监测和协助运行在 JVM 上的程序,甚至能够替换和修改某些类的定义。有了这样的功能,开发者就可以实现更为灵活的运行时虚拟机监控和 Java 类操作了,这样的特性实际上提供了一种虚拟机级别支持的 AOP 实现方式,使得开发者无需对 JDK 做任何升级和改动,就可以实现某些 AOP 的功能了。
        在 Java SE 6 里面,instrumentation 包被赋予了更强大的功能:启动后的 instrument、本地代码(native code)instrument,以及动态改变 classpath 等等。这些改变,意味着 Java 具有了更强的动态控制、解释能力,它使得 Java 语言变得更加灵活多变。
        “java.lang.instrument”包的具体实现,依赖于 JVMTI。JVMTI(Java Virtual Machine Tool Interface)是一套由 Java 虚拟机提供的,为 JVM 相关的工具提供的本地编程接口集合。JVMTI 是从 Java SE 5 开始引入,整合和取代了以前使用的 Java Virtual Machine Profiler Interface (JVMPI) 和 the Java Virtual Machine Debug Interface (JVMDI),而在 Java SE 6 中,JVMPI 和 JVMDI 已经消失了。JVMTI 提供了一套”代理”程序机制,可以支持第三方工具程序以代理的方式连接和访问 JVM,并利用 JVMTI 提供的丰富的编程接口,完成很多跟 JVM 相关的功能。当我们谈Debug时,我们在谈什么(Debug实现原理) 这个让我想到了这篇文章,其实感觉和debug的道理一样的,debug的时候可以修改参数,或者数据的信息。

    官方文档

    This class provides services needed to instrument Java programming language code. Instrumentation is the addition of byte-codes to methods for the purpose of gathering data to be utilized by tools. Since the changes are purely additive, these tools do not modify application state or behavior. Examples of such benign tools include monitoring agents, profilers, coverage analyzers, and event loggers.(这个类提供了测试 Java 编程语言代码所需的服务。仪器是将字节代码添加到方法中,目的是收集工具使用的数据。由于这些更改纯粹是附加的,因此这些工具不会修改应用程序状态或行为。此类良性工具的示例包括监控代理、分析器、覆盖分析器和事件记录器。) 
    有两种方法可以获取仪器接口的实例:

    • When a JVM is launched in a way that indicates an agent class. In that case an Instrumentation instance is passed to the premain method of the agent class.(当 JVM 以指示代理类的方式启动时。在这种情况下,检测实例被传递给代理类的 premain 方法。)
    • When a JVM provides a mechanism to start agents sometime after the JVM is launched. In that case an Instrumentation instance is passed to the agentmain method of the agent code.(当 JVM 在 JVM 启动后的某个时候提供启动代理的机制时,检测实例被传递给代理类的 agentmain 方法)

    Java Instrumentation-csdn  https://blog.csdn.net/DorMOUSENone/article/details/81781131

    三、Java agent debug 实践

    Agent 包结构

    agent 打包的信息

    META-INF.MANIFEST.MF,需要保护一些信息,就是入口类需要传递一个Instrumentation变量给你,JVM 启动的入口类的信息 Premain-Class: com.wangji92.agent.JvmAgentAop,这样标识这个是一个agent。

    Manifest-Version: 1.0
    Implementation-Title: jvm-agent-aop
    Premain-Class: com.wangji92.agent.JvmAgentAop
    Implementation-Version: 1.0-SNAPSHOT
    Built-By: wangji
    Agent-Class: com.wangji92.agent.JvmAgentAop
    Can-Redefine-Classes: true
    Specification-Title: jvm-agent-aop
    Can-Retransform-Classes: true
    Created-By: Apache Maven 3.6.1
    Build-Jdk: 1.8.0_181
    Specification-Version: 1.0-SNAPSHOT
    

    agent 入口类小例子

    package com.wangji92.agent;
    
    import java.lang.instrument.Instrumentation;
    
    /**
     * @author 汪小哥
     * @date 31-01-2020
     */
    public class BeforeJvmJavaAgent {
        public static void premain(String agentArgs, Instrumentation inst) {
            System.out.println("this is an agent.");
            System.out.println("this is an agent 和jvm 一起启动");
            System.out.println("args:" + agentArgs + "\n");
    
            Class[] allLoadedClasses = inst.getAllLoadedClasses();
            for (Class loadedClass : allLoadedClasses) {
                System.out.println("load class:" + loadedClass.getCanonicalName());
                if (loadedClass.getClassLoader() != null) {
                    System.out.println("  classloader"+loadedClass.getClassLoader().toString() + "\n");
                }else{
                    System.out.println("\n");
                }
            }
    
        }
    }
    
    

    maven 配置,参考arthas

     <build>
            <finalName>simple-before-jvm-agent</finalName>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                        <encoding>UTF-8</encoding>
                        <showDeprecation>true</showDeprecation>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-assembly-plugin</artifactId>
                    <executions>
                        <execution>
                            <goals>
                                <goal>single</goal>
                            </goals>
                            <phase>package</phase>
                            <configuration>
                                <descriptorRefs>
                                    <descriptorRef>jar-with-dependencies</descriptorRef>
                                </descriptorRefs>
                                <archive>
                                    <manifestEntries>
                                        <Premain-Class>com.wangji92.agent.BeforeJvmJavaAgent</Premain-Class>
                                        <Agent-Class>com.wangji92.agent.BeforeJvmJavaAgent</Agent-Class>
                                        <Can-Redefine-Classes>true</Can-Redefine-Classes>
                                        <Can-Retransform-Classes>true</Can-Retransform-Classes>
                                        <Specification-Title>${project.name}</Specification-Title>
                                        <Specification-Version>${project.version}</Specification-Version>
                                        <Implementation-Title>${project.name}</Implementation-Title>
                                        <Implementation-Version>${project.version}</Implementation-Version>
                                    </manifestEntries>
                                </archive>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    

    Java agent 加载的两种方式

    根据Java agent的挂载方式有两种,一种是直接在启动的时候挂载,一种是启动完成之后进行挂载(arthas 就是通过这种方式实现的)。这里实践的时候采用第一种。

    JVM 一起启动

    直接在启动参数中增加即可

    # 通过java 可以查看到帮助文档 
    -javaagent:<jarpath>[=<选项>]
     加载 Java 编程语言代理, 请参阅 java.lang.instrument
    

    比如这个

    • simple-before-jvm-agent-jar-with-dependencies.jar  agent 包
    • target-java.jar 目标spring boot 程序
    #!/bin/sh -x
    dir=$(cd `dirname $0`;pwd)
    echo $dir
    mvn clean package && \
    java -javaagent:$dir/simple-before-jvm-agent/target/simple-before-jvm-agent-jar-with-dependencies.jar=text-args \
    -jar $dir/target-java/target/target-java.jar
    

    JVM 启动之后 挂载(参考arthas)

    将arthas-agent attach 到目标java进程。
    主要代码:com.taobao.arthas.core.Arthas#attachAgent,直到这里,原始的arthas-core的进程处理已经结束了,同事触发了arthas-agent.jar 作为目标java类的代码类触发了arthas-agent Agent-Class(具体可以参考maven xml 配置) agentmain 方法

    ## 1、attach 到目标进程
    virtualMachine = VirtualMachine.attach("" + configure.getJavaPid());
    
    ## 2、在jvm启动后天就agent,第一个是agent的jar位置,第二个传递的参数
    ## 了解更多可以参考 java.lang.instrument.Instrumentation
    virtualMachine.loadAgent(arthasAgentPath,
                        configure.getArthasCore() + ";" + configure.toString());
    

    理解debug

    当我们谈Debug时,我们在谈什么(Debug实现原理) 这篇文章被我引用了很多次,其实debug就是JPDA之上进行处理,Java agent 也是通过 Instrumentation 依赖JVMTI 实现对于JVM中的字节码修改,获取JVM 虚拟机的加载的字节码的信息,两者之间太像了,当我们想讨论如何debug java agnet的代码的时候,是否想过agent 和目标的代码有什么异同?对对,都是在同一个JVM中的。无论是我们使用远程debug 还是IDEA上的debug其实实质上都是建立在JPDA的基础上,JPDA(Java Platform Debugger Architecture)是Java平台调试体系结构的缩写。由3个规范组成,分别是JVMTI(JVM Tool Interface),JDWP(Java Debug Wire Protocol),JDI(Java Debug Interface) 。因此都是在一个JVM 里面的,只要目标class 启动的时候开启了debug,那么agent 也可以被debug的。可能在直接使用IDEA debug的时候有一些限制,比如必须在同级的module下面才能debug,那么远程debug就是天然的可以啦!

    实战Agent debug(AOP 统计耗时)

    agent 入口类

    package com.wangji92.agent;
    
    import net.bytebuddy.agent.builder.AgentBuilder;
    import net.bytebuddy.description.type.TypeDescription;
    import net.bytebuddy.dynamic.DynamicType;
    import net.bytebuddy.implementation.MethodDelegation;
    import net.bytebuddy.matcher.ElementMatchers;
    import net.bytebuddy.utility.JavaModule;
    
    import java.lang.instrument.Instrumentation;
    
    import static net.bytebuddy.matcher.ElementMatchers.*;
    
    /**
     * https://segmentfault.com/a/1190000007253689
     * https://www.infoq.cn/article/Easily-Create-Java-Agents-with-ByteBuddy/
     * https://blog.csdn.net/undergrowth/article/details/86493336
     * https://www.jianshu.com/p/7a5a2c78dab4
     * https://blog.csdn.net/DorMOUSENone/article/details/81781131
     * jvmAop 处理
     *
     * @author 汪小哥
     * @date 01-02-2020
     */
    public class JvmAgentAop {
    
        public static void premain(String agentArgs, Instrumentation inst) {
            System.out.println("this is an agent.");
            System.out.println("this is an agent 和jvm 一起启动");
            System.out.println("args:" + agentArgs + "\n");
            new AgentBuilder.Default()
                    .type(nameStartsWith("com.wangji92.target").and(not(isInterface())).and(not(isStatic())))
                    .transform(new AgentBuilder.Transformer() {
                        @Override
                        public DynamicType.Builder<?> transform(DynamicType.Builder<?> builder, TypeDescription typeDescription, ClassLoader classLoader, JavaModule module) {
                            return builder.method(ElementMatchers.any())
                                    .intercept(MethodDelegation.to(CostTimeInterceptor.class));
                        }
                    }).installOn(inst);
    
        }
    }
    
    

    byte-buddy AOP 处理

    byte-buddy 修改字节码可以参考这个 https://blog.csdn.net/undergrowth/article/details/86493336
    这里只是简单的统计耗死问题。

    package com.wangji92.agent;
    
    import net.bytebuddy.implementation.bind.annotation.Origin;
    import net.bytebuddy.implementation.bind.annotation.RuntimeType;
    import net.bytebuddy.implementation.bind.annotation.SuperCall;
    
    import java.lang.reflect.Method;
    import java.util.concurrent.Callable;
    
    /**
     * aop 耗时计算
     *
     * @author 汪小哥
     * @date 01-02-2020
     */
    public class CostTimeInterceptor {
    
        @RuntimeType
        public static Object intercept(@Origin Method method,
                                       @SuperCall Callable<?> callable) throws Exception {
            System.out.println("call " + method.getName());
            long start = System.currentTimeMillis();
            try {
                return callable.call();
            } finally {
                System.out.println(method + " took " + (System.currentTimeMillis() - start));
            }
        }
    }
    
    

    目标类

    /**
     * @author 汪小哥
     * @date 30-01-2020
     */
    @RestController
    @RequestMapping("/")
    public class JavaAgentTargetController {
    
        @RequestMapping("/test/{name}")
        @ResponseBody
        public String getClassName(@PathVariable String name) {
            String result = this.getClass().getSimpleName().concat(name);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
               //
            }
            return result;
        }
    }
    

    启动脚本

    这里通过脚本启动,并开启远程debug,然后在IDEA 中添加一个remote debug 填写端口5005,随便访问一个目录类,即可实现debug agent的目的

    #!/bin/sh -x
    dir=$(cd `dirname $0`;pwd)
    echo $dir
    mvn clean package && \
    java -agentlib:jdwp=transport=dt_socket,address=5005,server=y,suspend=n \
    -javaagent:$dir/jvm-agent-aop/target/jvm-agent-aop-jar-with-dependencies.jar=text-args \
    -jar $dir/target-java/target/target-java.jar
    
    # 本文主要是为了测试 agent的debug 功能,从而了解arthas debug
    # 实际上,agent的 remote debug 只要agent和target 在同一个jvm 中就会被加载,从而可以debug。
    
    
    ## 通过Byte Buddy 实现字节码修改(skyworking 也是这样的) 参考 https://zhuanlan.zhihu.com/p/84514959
    ## 使用bytebuddy构建agent   https://segmentfault.com/a/1190000007253689
    ## 通过使用 Byte Buddy,便捷地创建 Java Agent  https://www.infoq.cn/article/Easily-Create-Java-Agents-with-ByteBuddy/
    ## byte-buddy 1.9.6 简述及原理1  https://blog.csdn.net/undergrowth/article/details/86493336 github 有demo
    ## java agent: JVM的层面的"AOP"  https://www.jianshu.com/p/7a5a2c78dab4
    
    

    四、总结

    不断的学习、总结,才能理解更加的深刻。
    代码地址:https://github.com/WangJi92/java-agent

    更多汪小哥

    展开全文
  • Agent技术研究与分析

    2021-04-18 10:12:34
    介绍了Agent和多Agent技术的背景和概念,比较了Agent系统和多Agent系统的体系结构,着重分析了Agent的结构,说明了多Agent系统中的各Agent之间用来进行知识交互的通信语言,最后列举了CSCL的交互与协作机制和技术...
  • ServerAgent2.2.1

    2018-12-24 15:55:26
    ServerAgent2.2.3,启动服务用来监控机器,可以获取性能测试过程中CPU、磁盘使用率等指标
  • zabbix系列:agent2 VS agent

    千次阅读 2021-01-02 17:24:13
    agent2 VS agent 对比项 Zabbix agent Zabbix agent 2 编程语言 C Go (含部分C语言实现) 是否守护进程 是 否 ( 5.0.4开始,Windows是守护进程) 支持扩展 C语言开发模块 GO语言插件...
  • zabbix-agent2 监控 oracle 数据库

    万次阅读 2021-04-08 13:33:10
    在zabbix5.0版本以上,新增了一个特性,那就是zabbix-agent2,这个是zabbix公司使用go语言重写的一个代理,可以完全替代原来的zabbix-agent。这个代理功能比原来的要强大的多,内置了很多个插件支持对基础资源的监控...
  • DesktopAgent-开源

    2021-07-19 18:37:38
    DesktopAgent 是 Microsoft Agent 的免费软件应用程序。 它使用 Microsoft Agent 的交互功能来显示可以使用动画、语音和语音识别与您交互的角色(代理)。
  • APM Agent 之 动态注入 agent

    千次阅读 2017-02-21 14:29:50
    APM agent在sprint 17加入了“动态注入”的新特性。使得agent可以在监控的目标应用不需要重启和额外配置的情况下,就能够注入到目标应用。agent动态注入特性支持JDK6及以上版本。一、动态注入agent的命令: 假设APM ...
  • javaagent

    千次阅读 2017-12-13 16:36:28
    Javaagent概述javaagent是一个简单优雅的java agent,利用java自带的instrument特性+javassist字节码编辑技术,实现了无侵入的方法级性能监控。相比于NewRelic或者开源的pinpoint,本工具主打的是简单,我们只记录每个...
  • 软件agent技术

    2011-10-26 13:11:29
    软件agent技术 软件agent技术 软件agent技术 软件agent技术
  • Agent系统

    千次阅读 2018-08-27 11:10:53
    Agent是分布式人工智能和现代计算机、通信技术发展的必然结果。给Agent下一个确切的定义很困难,一般都是根据自己的研究领域和需求进行定义。最经典和广为授受的是Wooldridge等人的“弱定义”和“强定义”[104]。1)...
  • UniAccess Agent 强制删除

    2018-09-19 16:00:18
    经过多次尝试,找到了强制删除 UniAccess Agent的办法,具体操作看附件
  • 智能Agent笔记

    千次阅读 2015-08-16 20:31:49
    理性Agent:追求尽可能好的行为表现。Agent表现如何取决于环境的本质。Agent通过传感器感知环境并通过执行器对所处环境产生影响。Agent的感知序列是该Agent所收到的所有输入数据的完整历史。一般地,Agent在任何给定...
  • Horizon 7.5.0 View Agent (32-bit) VMware-viewagent-7.5.0-8584427 这个是目前最新版本的,文件来自VM官方。
  • zabbix agent4.0.0下载,适用于64位Linux操作系统(文件全称:zabbix-agent-4.0.0-2.el7.x86_64.rpm)
  • ServerAgent-2.2.3

    2018-05-19 08:57:15
    Jmeter-CPU内存监控 。ServerAgent-2.2.3最新版本。ServerAgent监控用的agent,需要监控哪个服务器就放到哪个地方,linux和window通用,启动端口默认为4444,不用修改。
  • 该系统模型由中心Agent、信息Agent、交互Agent、分析Agent、平衡Agent和控制Agent组成,多个Agent通过中心Agent进行协调,共同完成控制任务。以此模型为基础,实现了锅炉智能控制系统,结果表明:这种基于Agent的...
  • ServerAgent-2.2.3.zip

    2018-05-24 16:17:42
    agent服务器 将ServerAgent-2.2.1.zip解压后放在需要监控的服务器上,并开启 startAgent.bat(windows) startAgent.sh (linux) linux服务器上首先将startAgent.sh设定为可执行文件: chmod 777 start...
  • 构建了区域Agent、路口Agent和车载Agent,区域Agent和车载Agent构成网络调度层,路口Agent构成信号控制层.车载Agent和路口Agent采用反应型结构、区域Agent采用思考型结构,从而建立了基于Agent的区域交通控制系统,并...
  • Java Agent介绍

    千次阅读 2018-09-24 14:18:30
    Java Agent注入的使用方法 在进程B中向进程A中注入java agent,需要满足以下条件: java agent中的所有依赖,在进程A中的classpath中都要能找到,否则在注入时进程A会报错NoClassDefFoundError java agent的pom...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 586,298
精华内容 234,519
关键字:

agent