{"id":380,"date":"2017-11-22T19:12:42","date_gmt":"2017-11-22T19:12:42","guid":{"rendered":"https:\/\/marketaylor.synology.me\/?p=380"},"modified":"2019-11-19T19:41:12","modified_gmt":"2019-11-19T19:41:12","slug":"adding-resource-statistics-to-your-applications","status":"publish","type":"post","link":"https:\/\/marketaylor.synology.me\/?p=380","title":{"rendered":"Adding resource statistics to your applications"},"content":{"rendered":"<p>MQ V9 added resource monitoring statistics that you can subscribe to. In this post I\u2019m going to show how you can generate similar statistics from your own applications using the same model. For example, you may want to track how many successful and how many failed messages are being processed.<\/p>\n<p><!--more See how to add statistics generation to your applications--><\/p>\n<h2>Introduction to resource statistics<\/h2>\n<p>Queue managers on the Distributed platforms publish many statistics about themselves and the systems they are running on. This started with MQ V8 on the Appliance, and was extended to the other platforms in V9. The fundamental concept is that a monitoring program retrieves metadata that describes the statistics from the queue manager and then subscribes to topics representing the real data. For more information about this approach, see <a href=\"https:\/\/www.ibm.com\/developerworks\/community\/blogs\/messaging\/entry\/Statistics_published_to_the_system_topic_in_MQ_v9?lang=en\" target=\"_blank\" rel=\"noopener noreferrer\">Mark Whitlock\u2019s post here<\/a>.<\/p>\n<p>Mark Bluemel then wrote an article about decoding the statistics that you can read <a href=\"https:\/\/www.ibm.com\/developerworks\/community\/blogs\/messaging\/entry\/A_first_look_at_MQ_Resource_USeage_handling_using_Java?lang=en\" target=\"_blank\" rel=\"noopener noreferrer\">here<\/a>.<\/p>\n<p>But the idea of the metadata can be extended to other components too. It does not have to apply only to queue manager internal data. I used the design to add statistics to a new component of MQ, the <a href=\"https:\/\/www.ibm.com\/blogs\/cloud-computing\/2017\/05\/mq-bridge-salesforce\/\" target=\"_blank\" rel=\"noopener noreferrer\">MQ Bridge to Salesforce<\/a> that was first shipped in MQ V9.0.2. I\u2019ve also received several questions about how these statistics work, and there seemed to be a positive reaction from an <a href=\"http:\/\/www.mqtechconference.com\/sessions_v2017.html\" target=\"_blank\" rel=\"noopener noreferrer\">MQTC<\/a> audience when I proposed writing up the approach.<\/p>\n<p>So this post describes and links to some code that you can copy and extend for generating arbitrary application-specific statistics.<\/p>\n<h2>The model<\/h2>\n<p>The design for these statistics involves a three-level classification. There are <strong>Classes<\/strong>, <strong>Types<\/strong>, and <strong>Elements<\/strong>. It is the Element that holds the actual values that can be displayed. An element may be further qualified with a name \u2013 in the queue manager statistics, this is where you see the Queue Name being used. Both the metadata and the real values are contained in PCF messages.<\/p>\n<p>When you want to add monitoring of your own applications, it is this model that you need to design first. The three tiers are a given; that cannot be changed. For some of the values I needed to generate, a design involving just two levels felt more appropriate but I had to introduce what was essentially a \u201cpadding\u201d level in the middle. That padding used the same name and description for the Type layer as for the Class, which seemed redundant but it was the only way to follow the model.<\/p>\n<h2>The sample program<\/h2>\n<p>I\u2019ve posted a short program that creates and describes some statistics as a<a href=\"https:\/\/gist.github.com\/ibmmqmet\/3196d9da2d37ef17aa61370cfcd2d92e\" target=\"_blank\" rel=\"noopener noreferrer\"> gist download<\/a> on Github. The statistics produced by this program are very simple \u2013 there are counts of \u201csystem level\u201d values, and counts for some specific named objects \u2013 but it should demonstrate how it can be extended for more realistic statistics. The program includes comments to describe what is going on at each step. It uses JMS as the core messaging API, but other APIs and languages could be used. Java does make it easy to work with PCF messages, though you can see some special considerations when writing those messages via JMS to ensure correct formatting.<\/p>\n<p>After connecting to the queue manager, the program builds metadata describing the classes, types and individual elements, and publishes these as <strong>retained<\/strong> publications. That allows monitoring programs to start up at any time and still be able to get the metadata. The metadata only needs to be published once, in this case as the program starts up. You can see the construction of the tree and the MQ messages that describe it in the <em>publishMetaData()<\/em> method. The program then continues to loop, publishing random numbers for each element.<\/p>\n<h2>How did I design this<\/h2>\n<p>There is not a huge amount of formal documentation on these resource statistics. One reason for that is the flexibility and potential for change given by the metadata approach. The best information on decoding the events is from the amqsrua sample program. I used both that program\u2019s source code and the executable to validate what was going on. I also used the amqsevt program a lot, subscribing to the various topics and seeing both how PCF components were built and that my generated messages matched the queue manager\u2019s construction.<\/p>\n<h2>Notes<\/h2>\n<p>There are several things to note here:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>\u00a0The code in this sample requires at least the MQ V9.0.2 (Continuous Delivery) Java client. Previous levels had problems generating the MQCFGR structure. The fixes have not been put back into the V9.0.0.x (LTS) stream as noone else has needed them. Of course, the fixes will be in any future LTS version of MQ. If you converted the sample to C (or another language) where you control the PCF formatting more directly, then you could use older MQ client interfaces.<\/li>\n<li>Version 9.0.2 was also where changes were made to amqsrua, to allow it to subscribe to user-chosen metatopics (a new -p option). The queue manager itself does not need to be at V9.0.2 if the applications \u2013 both monitors and generators \u2013 are connected as clients.<\/li>\n<li>The queue manager makes some nice optimisations internally, such as only generating statistics when it knows there are subscribers. That is not really an option for this kind of application-level code. While it would be possible to inquire on subscribers before publishing, it is probably more efficient to always generate the numbers and just have the queue manager throw away the publications when there are no subscriber. You would probably want to have an option to define how frequently the statistics should be generated (and to disable them entirely) in your application.<\/li>\n<li>This sample program holds open a separate object handle for each topic on which it publishes. That is OK for the small number of elements used here, but you may want to think about the costs of publishing statistics and the overall topic space if your design suggests using thousands of individually named objects in the topic tree. Subscriptions can be made to wildcards in the model, although not for the standard queue manager statistics (queues must be explicitly referred to in those subscriptions).<\/li>\n<li>There is an assumption that the program generating the statistics has a unique naming model for the tree. You could not run two copies of this example program as the statistics would interfere with each other. One solution I have considered is that the \u201capplication name\u201d in the metadata is extended for each instance of a running program to include a unique identifier. Though you would likely have to ensure that identifier was reused when the same instance was restarted. And monitoring programs that collect the data have to be configured to understand the identifier. Fortunately for my purposes, I didn\u2019t need to do that in the Bridge to Salesforce as only one instance can run at a time on a queue manager!<\/li>\n<li>When I started decoding the queue manager\u2019s resource events using amqsevt, I got a little confused at first because it appeared to show PCF elements referring to the ApplicationType or CodedCharSetId. In fact, that is just because the statistics events use an index number for the Element fields that happened to have the same value as the MQIA values for those parameters. There is no reason to start element identification numbers from zero (it\u2019s not processed as an array index, but as a key in a Map). I tried to reduce that confusion in this sample program by starting the element index values from some point in the MQIA_USER_LIST range. So amqsevt now says instead that it cannot decode the number to an MQ attribute. There\u2019s nothing wrong with the queue manager here, but you have to remember that the element values are not in any way related to the constants that you might see in other PCF events or commands.<\/li>\n<li>\u00a0The queue manager resource statistics are produced only by the Distributed platforms. But there is nothing stopping application-level code using the same approach on z\/OS. I have successfully run this sample program while connected to a z\/OS queue manager and run monitoring programs to collect the statistics from there. You might want to introduce a suitable topic object to control security on the topic tree. There is a <strong>SYSTEM.ADMIN.TOPIC<\/strong> object that controls access to the <strong>$SYS\/MQ<\/strong> tree automatically created on the Distibuted side; something similar may be useful on z\/OS, but it is not essential.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2>Running a monitor<\/h2>\n<p>Here is an example of a flow through the <em>amqsrua<\/em> sample that shows the statistics created by this sample. Remember that the $SYS has to be escaped in this environment to ensure it does not get interpreted as a shell variable.<\/p>\n<pre><br \/>$ amqsrua -p \"\\$SYS\/Application\/DemoMQMonitor\" -m QM1<br \/>SYSTEM : System Data<br \/>OBJECTS : Object Data<br \/>Enter Class selection<br \/>==&gt; <strong>SYSTEM<\/strong><br \/>T1 : Data about system resource T1<br \/>T2 : Data about system resource T2<br \/>Enter Type selection<br \/>==&gt; <strong>T1<\/strong><br \/>Publication received PutDate:20171120 PutTime:11241339 Interval:4.007 seconds<br \/>How many loops generated 41 10\/sec<br \/>A random number 3 1\/sec<br \/><br \/>Publication received PutDate:20171120 PutTime:11241740 Interval:4.008 seconds<br \/>How many loops generated 42 10\/sec<br \/>A random number 0<\/pre>\n<p>And here is another example, this time collecting information about the object called \u2018A\u2019.<\/p>\n<pre>$ amqsrua -p \"\\$SYS\/Application\/DemoMQMonitor\" -m QM1<br \/>SYSTEM : System Data<br \/>OBJECTS : Object Data<br \/>Enter Class selection<br \/>==&gt; <strong>OBJECTS<\/strong><br \/>OBJECTNAME : Object Specific Data<br \/>Enter Type selection<br \/>==&gt; <strong>OBJECTNAME<\/strong><br \/>An object name is required for Class(OBJECTS) Type(OBJECTNAME)<br \/>Enter object name<br \/>==&gt; <strong>A<\/strong><br \/>Publication received PutDate:20171120 PutTime:11251351 Interval:4.008 seconds<br \/>Successful invocations 5 1\/sec<br \/>Failed invocations 16 4\/sec<br \/>Total invocations 21 5\/sec<br \/><br \/>Publication received PutDate:20171120 PutTime:11251752 Interval:4.008 seconds<br \/>Successful invocations 12 3\/sec<br \/>Failed invocations 19 5\/sec<br \/>Total invocations 31 8\/sec<\/pre>\n<h2>Other monitors<\/h2>\n<p>I have also updated one of the packages from the MQ Go monitoring programs <a href=\"https:\/\/github.com\/ibm-messaging\/mq-metric-samples\" target=\"_blank\" rel=\"noopener noreferrer\">here<\/a>. The Prometheus package takes a \u201cmetaPrefix\u201d parameter to allow it to monitor arbitrary topics.<br \/>This allowed me to construct a simple dashboard in Grafana that starts off looking like this:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-382 size-full\" src=\"https:\/\/marketaylor.synology.me\/wp-content\/uploads\/Pictures\/2019\/11\/prom_demomq_blog.png\" alt=\"Application-generated statistics in Grafana\" width=\"1014\" height=\"366\" srcset=\"https:\/\/marketaylor.synology.me\/wp-content\/uploads\/Pictures\/2019\/11\/prom_demomq_blog.png 1014w, https:\/\/marketaylor.synology.me\/wp-content\/uploads\/Pictures\/2019\/11\/prom_demomq_blog-300x108.png 300w, https:\/\/marketaylor.synology.me\/wp-content\/uploads\/Pictures\/2019\/11\/prom_demomq_blog-768x277.png 768w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><\/p>\n<h2>Summary<\/h2>\n<p>I hope this has given you some ideas on how you might be able to extend your applications so they can be better monitored.<\/p>\n\n\n<p><\/p>\n<p class=\"last-modified\" style=\"border:1px solid;padding: 10px;\">This post was last updated on November 19th, 2019 at 07:41 pm<\/p>","protected":false},"excerpt":{"rendered":"<p>MQ V9 added resource monitoring statistics that you can subscribe to. In this post I\u2019m going to show how you can generate similar statistics from your own applications using the same model. For example, you may want to track how many successful and how many failed messages are being processed. This post was last updated &hellip; <a href=\"https:\/\/marketaylor.synology.me\/?p=380\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Adding resource statistics to your applications&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[5],"tags":[41,43,20,42],"class_list":["post-380","post","type-post","status-publish","format-standard","hentry","category-mq","tag-events","tag-grafana","tag-mqseries","tag-prometheus"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Adding resource statistics to your applications - Mark Taylor&#039;s Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/marketaylor.synology.me\/?p=380\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Adding resource statistics to your applications - Mark Taylor&#039;s Blog\" \/>\n<meta property=\"og:description\" content=\"MQ V9 added resource monitoring statistics that you can subscribe to. In this post I\u2019m going to show how you can generate similar statistics from your own applications using the same model. For example, you may want to track how many successful and how many failed messages are being processed. This post was last updated &hellip; Continue reading &quot;Adding resource statistics to your applications&quot;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/marketaylor.synology.me\/?p=380\" \/>\n<meta property=\"og:site_name\" content=\"Mark Taylor&#039;s Blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-11-22T19:12:42+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-11-19T19:41:12+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/marketaylor.synology.me\/wp-content\/uploads\/Pictures\/2019\/11\/prom_demomq_blog.png\" \/>\n<meta name=\"author\" content=\"Mark\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@marketaylor\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Mark\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=380#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=380\"},\"author\":{\"name\":\"Mark\",\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/#\\\/schema\\\/person\\\/2d6f4113ff54187023e20c20186bbb3c\"},\"headline\":\"Adding resource statistics to your applications\",\"datePublished\":\"2017-11-22T19:12:42+00:00\",\"dateModified\":\"2019-11-19T19:41:12+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=380\"},\"wordCount\":1533,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=380#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/marketaylor.synology.me\\\/wp-content\\\/uploads\\\/Pictures\\\/2019\\\/11\\\/prom_demomq_blog.png\",\"keywords\":[\"events\",\"grafana\",\"mqseries\",\"prometheus\"],\"articleSection\":[\"IBM MQ\"],\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/marketaylor.synology.me\\\/?p=380#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=380\",\"url\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=380\",\"name\":\"Adding resource statistics to your applications - Mark Taylor&#039;s Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=380#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=380#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/marketaylor.synology.me\\\/wp-content\\\/uploads\\\/Pictures\\\/2019\\\/11\\\/prom_demomq_blog.png\",\"datePublished\":\"2017-11-22T19:12:42+00:00\",\"dateModified\":\"2019-11-19T19:41:12+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/#\\\/schema\\\/person\\\/2d6f4113ff54187023e20c20186bbb3c\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=380#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/marketaylor.synology.me\\\/?p=380\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=380#primaryimage\",\"url\":\"https:\\\/\\\/marketaylor.synology.me\\\/wp-content\\\/uploads\\\/Pictures\\\/2019\\\/11\\\/prom_demomq_blog.png\",\"contentUrl\":\"https:\\\/\\\/marketaylor.synology.me\\\/wp-content\\\/uploads\\\/Pictures\\\/2019\\\/11\\\/prom_demomq_blog.png\",\"width\":1014,\"height\":366,\"caption\":\"Application-generated statistics in Grafana\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=380#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/marketaylor.synology.me\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Adding resource statistics to your applications\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/#website\",\"url\":\"https:\\\/\\\/marketaylor.synology.me\\\/\",\"name\":\"Mark Taylor&#039;s Blog\",\"description\":\"Messaging, Music and Moving Around\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/marketaylor.synology.me\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/#\\\/schema\\\/person\\\/2d6f4113ff54187023e20c20186bbb3c\",\"name\":\"Mark\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/9a5ae091c43730194cba7cabb5d65c1dc3f48d05caaddec6ff2319a1ce66376f?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/9a5ae091c43730194cba7cabb5d65c1dc3f48d05caaddec6ff2319a1ce66376f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/9a5ae091c43730194cba7cabb5d65c1dc3f48d05caaddec6ff2319a1ce66376f?s=96&d=mm&r=g\",\"caption\":\"Mark\"},\"sameAs\":[\"https:\\\/\\\/x.com\\\/marketaylor\"],\"url\":\"https:\\\/\\\/marketaylor.synology.me\\\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Adding resource statistics to your applications - Mark Taylor&#039;s Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/marketaylor.synology.me\/?p=380","og_locale":"en_GB","og_type":"article","og_title":"Adding resource statistics to your applications - Mark Taylor&#039;s Blog","og_description":"MQ V9 added resource monitoring statistics that you can subscribe to. In this post I\u2019m going to show how you can generate similar statistics from your own applications using the same model. For example, you may want to track how many successful and how many failed messages are being processed. This post was last updated &hellip; Continue reading \"Adding resource statistics to your applications\"","og_url":"https:\/\/marketaylor.synology.me\/?p=380","og_site_name":"Mark Taylor&#039;s Blog","article_published_time":"2017-11-22T19:12:42+00:00","article_modified_time":"2019-11-19T19:41:12+00:00","og_image":[{"url":"https:\/\/marketaylor.synology.me\/wp-content\/uploads\/Pictures\/2019\/11\/prom_demomq_blog.png","type":"","width":"","height":""}],"author":"Mark","twitter_card":"summary_large_image","twitter_creator":"@marketaylor","twitter_misc":{"Written by":"Mark","Estimated reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/marketaylor.synology.me\/?p=380#article","isPartOf":{"@id":"https:\/\/marketaylor.synology.me\/?p=380"},"author":{"name":"Mark","@id":"https:\/\/marketaylor.synology.me\/#\/schema\/person\/2d6f4113ff54187023e20c20186bbb3c"},"headline":"Adding resource statistics to your applications","datePublished":"2017-11-22T19:12:42+00:00","dateModified":"2019-11-19T19:41:12+00:00","mainEntityOfPage":{"@id":"https:\/\/marketaylor.synology.me\/?p=380"},"wordCount":1533,"commentCount":0,"image":{"@id":"https:\/\/marketaylor.synology.me\/?p=380#primaryimage"},"thumbnailUrl":"https:\/\/marketaylor.synology.me\/wp-content\/uploads\/Pictures\/2019\/11\/prom_demomq_blog.png","keywords":["events","grafana","mqseries","prometheus"],"articleSection":["IBM MQ"],"inLanguage":"en-GB","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/marketaylor.synology.me\/?p=380#respond"]}]},{"@type":"WebPage","@id":"https:\/\/marketaylor.synology.me\/?p=380","url":"https:\/\/marketaylor.synology.me\/?p=380","name":"Adding resource statistics to your applications - Mark Taylor&#039;s Blog","isPartOf":{"@id":"https:\/\/marketaylor.synology.me\/#website"},"primaryImageOfPage":{"@id":"https:\/\/marketaylor.synology.me\/?p=380#primaryimage"},"image":{"@id":"https:\/\/marketaylor.synology.me\/?p=380#primaryimage"},"thumbnailUrl":"https:\/\/marketaylor.synology.me\/wp-content\/uploads\/Pictures\/2019\/11\/prom_demomq_blog.png","datePublished":"2017-11-22T19:12:42+00:00","dateModified":"2019-11-19T19:41:12+00:00","author":{"@id":"https:\/\/marketaylor.synology.me\/#\/schema\/person\/2d6f4113ff54187023e20c20186bbb3c"},"breadcrumb":{"@id":"https:\/\/marketaylor.synology.me\/?p=380#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/marketaylor.synology.me\/?p=380"]}]},{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/marketaylor.synology.me\/?p=380#primaryimage","url":"https:\/\/marketaylor.synology.me\/wp-content\/uploads\/Pictures\/2019\/11\/prom_demomq_blog.png","contentUrl":"https:\/\/marketaylor.synology.me\/wp-content\/uploads\/Pictures\/2019\/11\/prom_demomq_blog.png","width":1014,"height":366,"caption":"Application-generated statistics in Grafana"},{"@type":"BreadcrumbList","@id":"https:\/\/marketaylor.synology.me\/?p=380#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/marketaylor.synology.me\/"},{"@type":"ListItem","position":2,"name":"Adding resource statistics to your applications"}]},{"@type":"WebSite","@id":"https:\/\/marketaylor.synology.me\/#website","url":"https:\/\/marketaylor.synology.me\/","name":"Mark Taylor&#039;s Blog","description":"Messaging, Music and Moving Around","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/marketaylor.synology.me\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":"Person","@id":"https:\/\/marketaylor.synology.me\/#\/schema\/person\/2d6f4113ff54187023e20c20186bbb3c","name":"Mark","image":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/secure.gravatar.com\/avatar\/9a5ae091c43730194cba7cabb5d65c1dc3f48d05caaddec6ff2319a1ce66376f?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/9a5ae091c43730194cba7cabb5d65c1dc3f48d05caaddec6ff2319a1ce66376f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/9a5ae091c43730194cba7cabb5d65c1dc3f48d05caaddec6ff2319a1ce66376f?s=96&d=mm&r=g","caption":"Mark"},"sameAs":["https:\/\/x.com\/marketaylor"],"url":"https:\/\/marketaylor.synology.me\/?author=1"}]}},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=\/wp\/v2\/posts\/380","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=380"}],"version-history":[{"count":6,"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=\/wp\/v2\/posts\/380\/revisions"}],"predecessor-version":[{"id":387,"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=\/wp\/v2\/posts\/380\/revisions\/387"}],"wp:attachment":[{"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=380"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=380"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=380"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}