Mendix监控实现方案(使用自带端口)
前言
Mendix监控方案目前有三种可实现方式:
- 使用mendix默认提供的端口获取监控数据;
- 使用appdynamic监控;
- 使用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,我们将及时处理。
微信扫码关注
更新实时通知