04
2019
09

Mendix监控实现方案(使用自带端口)

前言

Mendix监控方案目前有三种可实现方式:

  1. 使用mendix默认提供的端口获取监控数据;
  2. 使用appdynamic监控;
  3. 使用mendix底层API监控

正文

此文主要通过mendix默认的8090端口获取监控数据;你可以通过向mendix程序发送JSON请求来调用Mendix运行时监视操作。这是通过向应用程序配置中指定的管理端口发送请求(默认为8090)来完成的。

您可以通过导航到项目 > 设置 > 配置 > 您的配置 > 服务器 > 管理端口来更改Desktop Modeler的管理端口。

请求必须是POST类型,没有授权和以下标头:

  • Content-Type:application / json
  • X-M2EE-Authentication:yourM2EEPassword_Base64Encoded

M2EE密码不是超级管理员密码,而是单独的密码。如果您在本地部署了应用程序,则可以在settings.yaml文件中设置此密码,该文件位于Apps / YourProject文件夹中。如果从Desktop Modeler运行应用程序,则Mendix会自动设置M2EE密码,您可以从应用程序进程的环境变量中检索它。

下文主要以Mendix客户端运行为例;

一、获取X-M2EE-Authentication

1、启动Mendix客户端;

2、在微软官网下载ProcessExplorer并运行procexp.exe;

3、复制上图的密码并使用Base64加密

二、测试一个接口

三、常用监控接口

英文地址:https://docs.mendix.com/refguide/monitoring-mendix-runtime

1、 Runtime Statistics

请求参数:

"{"action" : "runtime_statistics", "params":{} }";

返回字段:

"{  "feedback":  {  "requests":  [  {"name":"","value":97,"last_request_timestamp":1394785085325},  {"name":"file","value":0,"last_request_timestamp":1394785072325},  {"name":"ws-doc/","value":0,"last_request_timestamp":1394785072325},  {"name":"xas/","value":8,"last_request_timestamp":1394785082325},  {"name":"ws/","value":0,"last_request_timestamp":1394785072325}  ],  "cache":  {  "total_count":2  },  "sessions":  {  "user_sessions":{  "562949953421313":[  "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:39.0) Gecko/20100101 Firefox/39.0"  ]  },  "named_users":3,  "named_user_sessions":1,  "anonymous_sessions":0  },  "connectionbus":  {  "update":7,  "transaction":0,  "select":28,  "delete":5,  "insert":5  },  "memory":  {  "code":0,  "init_nonheap":2555904,  "init_heap":268435456,  "eden":0,  "memorypools":[  {  "is_heap":false,  "usage":11788032,  "name":"Code Cache",  "index":0  },  {  "is_heap":false,  "usage":49590256,  "name":"Metaspace",  "index":1  },  {  "is_heap":false,  "usage":6458552,  "name":"Compressed Class Space",  "index":2  },  {  "is_heap":true,  "usage":106799624,  "name":"PS Eden Space",  "index":3  },  {  "is_heap":true,  "usage":0,  "name":"PS Survivor Space",  "index":4  },  {  "is_heap":true,  "usage":18500976,  "name":"PS Old Gen",  "index":5  }  ],  "tenured":0,  "committed_heap":301465600,  "max_heap":3817865216,  "survivor":0,  "used_nonheap":67844048,  "max_nonheap":-1,  "committed_nonheap":72777728,  "permanent":0,  "used_heap":125300600  },  "result":0  }"

requests

显示有关每个处理程序的请求的信息。值字段显示每个处理程序的请求数。从Mendix 5.3开始,last_request_timestamp字段显示上次处理的请求的时间戳(以毫秒为单位)。如果没有处理请求,则此字段显示处理程序注册的时刻。空处理程序表示资源请求处理程序,它处理图像,表单等(仅在没有反向代理用于静态内容处理时使用)。"file"处理文件上传和下载,"xas /"处理由Web客户端发出的CRUD操作和微流执行调用,"ws /"和"ws-doc /"处理Web服务请求并提供Web服务文档。

cache:

显示当前属于运行时状态的对象总数(所有会话一起)。运行时状态驻留在内存(非集群运行时)或Redis或数据库(集群运行时)中。状态中的对象太多可能会降低Mendix Runtime的性能。

会话 "user_sessions"部分显示当前用户会话及其用户代理。其他部分显示每个类别的会话数。类别是"命名用户"(用户实例的数量),"named_user_sessions"(非匿名并发会话的数量)和"anonymous_sessions"(匿名并发会话的数量)。

Connectionbus

数据库请求数。区分"选择","更新","插入","删除"命令和启动数据库事务。

memory

对于在Java8上运行的低于Mendix 6.6或Mendix 5.21.5的版本,响应的"memory"部分中返回的信息提供了不完整和不正确的信息。如果您依赖本节中有关这些版本的信息,我们建议您将版本升级到Mendix 6.7或5.21.5或更高版本。出于向后兼容性原因,"code", "eden", "tenured", "survivor"字段仍然存在,但不应再依赖它们。它们将从Mendix 7开始删除。

表示分配给指定内存部分的字节数。有关一般说明,请参阅有关调整垃圾回收的Oracle文档。对于堆和非堆字段,请参阅内存使用情况页面。"memorypools"部分包含所有内存池的有序列表,与我们从JVM接收它们的顺序完全相同,顺序和MemoryPoolMxBean的某些字段:

  • "usage":返回此内存池的内存使用量估计值(以字节为单位)。
  • "is_heap":这个内存池是否是堆的一部分?
  • "name":JVM收到的内存池的描述。这些名称可以根据例如JDK,内存管理器或垃圾收集选项而不同。
  • "index":JSON数组中的索引。不严格需要此字段,因为池在列表中返回,因此您可以并且应该依赖列表的顺序,以防您在程序中处理它们。

2、Server statistics

请求

"{"action" : "server_statistics", "params":{} }"

响应

{  "feedback":{  "jetty":{  "current_connections":0,  "max_connections":0,  "max_idle_time_s":200  },  "threadpool":  {  "idle_threads":3,  "max_threads":254,  "threads_priority":5,  "threads":8,  "max_queued":-1,  "min_threads":8,  "max_idle_time_s":60,  "max_stop_time_s":0  }  },  "result":0  }

服务器统计信息监视器操作提供有关嵌入式Jetty Web服务器的信息。"jetty"部分列出了当前打开的连接数和最大打开连接数。此外,列出了Jetty在正常情况下关闭前的最大连接空闲时间。请注意,在Mendix 7.9及更高版本中,有关Jetty资源不足时关闭之前连接的最大空闲时间("max_idle_time_s_low_resources")的信息将作为Jetty升级的一部分被删除,因为它不再由Jetty提供。

"threadpool"部分提供有关处理程序的线程池的信息,该处理程序处理通过运行时端口的所有请求。有关更多信息,请参阅Jetty QueuedThreadPool文档。

3、 login user

请求

"{"action" : "get_logged_in_user_names", "params":{} }"

响应

{  "feedback":  {  "count":1,  "users":["MxAdmin"]  },  "result":0  }

显示当前登录的用户。如果用户有多个会话,则此用户将为每个会话列出一次。

4、Thread stack traces

请求

"{"action" : "get_all_thread_stack_traces", "params":{} }"

响应

{  "feedback":  {  "qtp1967003817-95":[  "sun.misc.Unsafe.park(Native Method)",  "java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)",  "java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)",  "java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:467)",  "com.mendix.modules.microflowengine.debugger.internal.EventPusher.handleRequest(EventPusher.scala:18)",  "com.mendix.modules.microflowengine.debugger.internal.DebuggerHandler.processJsonRequest(DebuggerHandler.scala:124)",  "com.mendix.modules.microflowengine.debugger.internal.DebuggerHandler.processRequest(DebuggerHandler.scala:50)",  "com.mendix.externalinterface.connector.MxRuntimeConnector$1.execute(MxRuntimeConnector.java:69)",  "com.mendix.externalinterface.connector.MxRuntimeConnector$1.execute(MxRuntimeConnector.java:66)",  "com.mendix.util.classloading.Runner.doRunUsingClassLoaderOf(Runner.java:32)",  "com.mendix.externalinterface.connector.MxRuntimeConnector.processRequest(MxRuntimeConnector.java:72)",  "com.mendix.core.impl.MxRuntimeImpl.processRequest(MxRuntimeImpl.java:715)",  "com.mendix.m2ee.appcontainer.server.handler.RuntimeHandler.handle(RuntimeHandler.java:41)",  "org.eclipse.jetty.server.handler.HandlerList.handle(HandlerList.java:52)",  "org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)",  "org.eclipse.jetty.server.Server.handle(Server.java:368)",  "org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:489)",  "org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:942)",  "org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:1004)",  "org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:647)",  "org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)",  "org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)",  "org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:628)",  "org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52)",  "org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)",  "org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)",  "java.lang.Thread.run(Thread.java:745)"  ],  "pool-1-thread-10":[  "sun.misc.Unsafe.park(Native Method)",  "java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)",  "java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)",  "java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1088)",  "java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)",  "java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)",  "java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)",  "java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)",  "java.lang.Thread.run(Thread.java:745)"  ],  },  "result":0  }

按名称返回所有当前线程堆栈跟踪。这对于低级别分析应用程序中发生的情况很有用。使用"get_current_runtime_executions"请求检索更高级别的信息(微流和其他操作)。

5、 Runtime Status

请求

"{"action" : "runtime_status", "params":{} }"

Java的

复制

响应

{  "feedback":{  "status":"running"  },  "result":0  }

返回当前的Mendix运行时状态。可能的状态值包括: "created", "starting", "broken", "running", "stopping" and "stopped"。此信息可用于跟踪在给出启动或停止命令时Mendix Runtime的状态,或检查运行时是否仍在运行。

6、Check Health

请求

"{"action" : "check_health", "params":{} }"

响应

{  "feedback":{  "health":"sick",  "diagnosis":  "Remote product web service is offline"  },  "result":0  }

在Mendix Desktop Modeler中,可以配置运行状况检查微流。这个微流可以报告应用程序的功能状态:应用程序的一般功能是否有效,是否提供必要的远程服务?

如果已配置运行状况检查微流,则此请求将报告当前运行状况。"health"值可以是 "healthy," "sick," 或者 "unknown"(当没有配置健康微流时)。对于"sick"值,"diagnosis"值将给出应用程序不健康的原因。这个原因是健康检查微流的返回值。

此请求只能在Mendix运行时状态为"正在运行" 时执行(请参阅上面的运行时状态)。

7、About Runtime

请求

"{"action" : "about", "params":{} }"

响应

{  "feedback":{  "model_version":"unversioned",  "copyright":"Copyright © 2003-2016 Mendix bv. All rights reserved.",  "build":"unreleased",  "vendor":"Mendix",  "name":"Mendix Runtime",  "java_version":"1.8.0_77",  "xasid":"68ece856-3771-4024-9c42-078aaa2282aa",  "version":"unreleased"  },  "result":0  }

返回有关Mendix运行时的反馈。"java_version"可从Mendix 6.6开始提供。

8、Current Executions

请求

"{"action" : "get_current_runtime_requests", "params":{} }"

响应

{  "feedback":{  "202de1e51639ae0":{  "request_duration":106175,  "type":"CLIENT",  "user":"Anonymous_2ce7c971-f077-4aca-83c5-f3898443ed01",  "action_stack":[  {  "xpath":"//MyFirstModule.Entity",  "amount":1,  "depth":0,  "offset":-1,  "sort":{},  "type":"RetrieveXPathAction"  },  {  "current_activity":{  "caption":"Retrieve Entity from database",  "type":"RetrieveByXPath"  },  "name":"MyFirstModule.LoopNested",  "type":"Microflow"  },  {  "current_activity":{  "caption":"LoopNested",  "type":"SubMicroflow"  },  "name":"MyFirstModule.Loop",  "type":"Microflow"  }  ]},  "bcbb5508-0293-4f12-b290-ee109962811e":{  "request_duration":104776,  "type":"CLIENT_ASYNC_MONITORED",  "user":"Anonymous_2ce7c971-f077-4aca-83c5-f3898443ed01",  "action_stack":[  {  "current_activity":{  "caption":"Retrieve Entity from database",  "type":"RetrieveByXPath"  },  "name":"MyFirstModule.LoopNested",  "type":"Microflow"  },  {  "current_activity":{  "caption":"LoopNested",  "type":"SubMicroflow"  },  "name":"MyFirstModule.Loop",  "type":"Microflow"  }  ]}  },  "result":0  }

此请求返回Mendix Runtime已知的当前操作执行。其中的操作可以是微流,Java操作,Web服务调用和预定事件。对于每次执行,报告以下内容:

  • 执行的"duration"(以毫秒为单位)。
  • 执行的"type"。可能的类型是"CLIENT","CLIENT_ASYNC","CLIENT_ASYNC_MONITORED","CUSTOM","WEB_SERVICE","SCHEDULED_EVENT"和"UNKNOWN"。"CLIENT_ASYNC"是从Web客户端触发的异步微流调用,"CLIENT_ASYNC_MONITORED"是Mendix运行时中异步微流的实际执行,它发生在不同的线程中。
  • "user"是与执行操作的会话相关联的用户的名称。在非用户会话的情况下,显示名称"System"。
  • "action_stack"显示了此执行的操作堆栈。对于该堆栈中的每个动作,显示详细信息,例如,对于微流,显示当前活动和微流的名称。

本站声明:网站内容来源于网络,如有侵权,请联系我们https://www.qiquanji.com,我们将及时处理。

微信扫码关注

更新实时通知

« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。