{"id":373,"date":"2018-07-31T17:53:46","date_gmt":"2018-07-31T16:53:46","guid":{"rendered":"https:\/\/marketaylor.synology.me\/?p=373"},"modified":"2019-11-25T09:45:23","modified_gmt":"2019-11-25T09:45:23","slug":"application-activity-formatting-and-extracting-key-information","status":"publish","type":"post","link":"https:\/\/marketaylor.synology.me\/?p=373","title":{"rendered":"Application Activity &#8211; formatting and extracting key information"},"content":{"rendered":"<h2>Application Activity Trace<\/h2>\n<p><a href=\"https:\/\/www.ibm.com\/support\/knowledgecenter\/en\/SSFKSJ_9.1.0\/com.ibm.mq.mon.doc\/q037520_.html\" target=\"_blank\" rel=\"noopener noreferrer\">Application Activity Trace<\/a> is a mechanism on the MQ Distributed platforms that give a report of all the MQI calls made by a program. Originally configured via a text file, MQ V9 enhanced them by allowing a monitoring application to <a href=\"https:\/\/www.ibm.com\/support\/knowledgecenter\/en\/SSFKSJ_9.1.0\/com.ibm.mq.mon.doc\/mo00020_.html\" target=\"_blank\" rel=\"noopener noreferrer\">subscribe to topics<\/a> that describe the application or channel of interest.<br \/>\n<!--more See how to extract key fields from events--><br \/>\nLike all MQ events, they are PCF messages with the need to format them before they can be read by a real person. MQ provides a sample program, <strong>amqsact<\/strong> to do just that. But that sample program does not make it easy to automate processing of the events. Production-level monitoring tools are expected to take the raw events, format them, and then do something interesting with the contents.<\/p>\n<p>In <a href=\"https:\/\/marketaylor.synology.me\/?p=401\" target=\"_blank\" rel=\"noopener noreferrer\">another post<\/a> I wrote about the <strong>amqsevt<\/strong> sample program and extensions that provide JSON output for MQ events. I did not originally intend amqsevt to be used for application activity events. I was more interested in processing the regular events such as &#8220;queue full&#8221;, and the <strong>amqsact<\/strong> sample was already available and designed specifically for those events. But it did turn out to work with them anyway. That JSON-capable variant of amqsevt is included in the new MQ V9.1, so you don&#8217;t need to download and compile the program yourself. And since it is now part of the product I&#8217;ve deleted the original source code from github.<\/p>\n<p>One benefit of using JSON is that there are many tools capable of processing that format. In the earlier article about amqsevt, I showed how events could be passed to Splunk. This new article shows how I can use amqsevt to get a few key fields from application activity trace with a simple filter. That should make any subsequent review &#8211; perhaps an application audit &#8211; or processing much faster. It ought to be a much lighter-weight mechanism for monitoring what applications do, if you don&#8217;t need to preserve the full set of data that activity traces contain.<\/p>\n<p>This can be seen as another piece of a broader strategy of extending MQ&#8217;s administrative actions and reports to work with JSON. There is the <a href=\"https:\/\/www.ibm.com\/support\/knowledgecenter\/en\/SSFKSJ_9.1.0\/com.ibm.mq.adm.doc\/q128250_.html\" target=\"_blank\" rel=\"noopener noreferrer\">REST administrative API<\/a>, <a href=\"https:\/\/developer.ibm.com\/messaging\/2017\/12\/05\/introducing-mq-error-logs-json-format\/\" target=\"_blank\" rel=\"noopener noreferrer\">error logs via JSON<\/a>, and even <a href=\"https:\/\/marketaylor.synology.me\/?p=396\" target=\"_blank\" rel=\"noopener noreferrer\">z\/OS SMF<\/a> data can be formatted that way.<\/p>\n<h2>The English output from amqsevt<\/h2>\n<p>I&#8217;ll start off showing the basic English-ish output from amqsevt. For these examples, I&#8217;m using the queue-based activity trace information rather than the subscription model, but both work equally well. In a real environment, you may prefer to use the subscription approach to permit multiple independent processors of the events.<\/p>\n<p>Run the command<\/p>\n<pre>  amqsevt -m QM1 -q SYSTEM.ADMIN.TRACE.ACTIVITY.QUEUE \n<\/pre>\n<p>and the start of the output will look like this:<\/p>\n<pre>**** Message #1 (5712 Bytes) on Queue SYSTEM.ADMIN.TRACE.ACTIVITY.QUEUE ****\nEvent Type                       : Activity Trace [209]\nReason                           : None [0]\nEvent created                    : 2018\/07\/10 12:38:22.81 GMT\n  Queue Mgr Name                 : QM1\n  Host Name                      : example.hursley.ibm.com\n  Start Date                     : 2018-07-10\n  Start Time                     : 13:38:22\n  Appl Name                      : amqsput\n  Channel Type                   : Svrconn\n  ...\n  ACTIVITY TRACE\n    Operation Id                 : Connx\n    Thread Id                    : 88\n    Operation Date               : 2018-07-10\n    Operation Time               : 13:38:22\n    Connection Id                : 414D514356393030305F4120202020205B2B779523E479A8\n    Queue Mgr Name               : QM1\n    Qmgr Op Duration             : 1102\n    Comp Code                    : Ok [0]\n  ...\n<\/pre>\n<h2>The JSON output from amqsevt<\/h2>\n<p>Next, I will do the same thing but adding the new &#8220;-o json&#8221; option to the command<\/p>\n<pre>  amqsevt -m QM1 -q SYSTEM.ADMIN.TRACE.ACTIVITY.QUEUE -o json\n<\/pre>\n<p>Which produces output that starts like this:<\/p>\n<pre>{\n\"eventSource\" : { \"objectName\": \"SYSTEM.ADMIN.TRACE.ACTIVITY.QUEUE\",\n                    \"objectType\" : \"Queue\" },\n\"eventType\" : {\n    \"name\" : \"Activity Trace\",\n    \"value\" : 209\n  },\n\"eventReason\" : {\n    \"name\" : \"None\",\n    \"value\" : 0\n  },\n\"eventCreation\" : {\n    \"timeStamp\"  : \"2018-07-10T12:44:26Z\",\n    \"epoch\"      : 1531226666\n  },\n\"eventData\" : {\n  \"queueMgrName\" : \"QM1\",\n  \"hostName\" : \"example.hursley.ibm.com\",\n  \"startDate\" : \"2018-07-10\",\n  \"startTime\" : \"13:44:25\",\n  \"endDate\" : \"2018-07-10\",\n  \"endTime\" : \"13:44:26\",\n  \"commandLevel\" : 910,\n...\n<\/pre>\n<p>Any management application that understands JSON could take this and process it directly.<\/p>\n<h2>CSV-formatted filtered output from amqsevt<\/h2>\n<p>The final demonstration filters the JSON to give single output lines for each MQI verb. These show key fields describing an application&#8217;s execution. The command to get the messages is identical to before, but there is an extra step after the retrieval.<\/p>\n<pre>  amqsevt -m QM1 -q SYSTEM.ADMIN.TRACE.ACTIVITY.QUEUE -o json | jq -r -f jqFilt\n<\/pre>\n<p>I&#8217;ll show the output and then describe how I created it.<\/p>\n<h3>Output<\/h3>\n<p>The output looks like this:<\/p>\n<pre>\"amqsput\",\"2018-07-11\",\"08:16:48\",\"Connx\",0,\"N\/A\"\n\"amqsput\",\"2018-07-11\",\"08:16:48\",\"Open\",0,\"X\"\n\"amqsput\",\"2018-07-11\",\"08:16:48\",\"Put\",0,\"X\",48,\"414D512056393030305F4120202020205B2B779523E4BFBE\"\n\"amqsput\",\"2018-07-11\",\"08:16:48\",\"Close\",0,\"X\"\n\"amqsput\",\"2018-07-11\",\"08:16:48\",\"Disc\",0,\"N\/A\"\n\"amqsget\",\"2018-07-11\",\"08:16:48\",\"Connx\",0,\"N\/A\"\n\"amqsget\",\"2018-07-11\",\"08:16:48\",\"Open\",0,\"X\"\n\"amqsget\",\"2018-07-11\",\"08:16:48\",\"Get\",0,\"X\",38,\"414D512056393030305F4120202020205B2B779523E4BFBE\"\n\"amqsget\",\"2018-07-11\",\"08:16:48\",\"Get\",2033,\"X\",250059,0\n\"amqsget\",\"2018-07-11\",\"08:16:48\",\"Close\",0,\"X\"\n\"amqsget\",\"2018-07-11\",\"08:16:48\",\"Disc\",0,\"N\/A\"\n<\/pre>\n<p>This shows the execution of amqsput and amqsget, with a measure of how long in microseconds it took to do the MQPUT and MQGET on queue &#8220;X&#8221;. I&#8217;ve also chosen to show the msgid from the messages which might be valuable for later auditing. You can see how they match up here, demonstrating that the same message was sent and retrieved. You can also see that a second MQGET took 250ms. That is the wait interval after which there&#8217;s a 2033 (no message available) return code. The rows are in CSV (comma-separated value) style, another common format for direct processing or for import to spreadsheets and databases where they can be analysed.<\/p>\n<h3>The jq command<\/h3>\n<p>The <strong>jq<\/strong> command is a commonly-used open source program that manipulates JSON records. It&#8217;s a bit like <strong>awk<\/strong> but dealing with JSON structures instead of text fields. There are <a href=\"https:\/\/stedolan.github.io\/jq\/download\" target=\"_blank\" rel=\"noopener noreferrer\">compiled versions<\/a> of it for many platforms including Linux and Windows. It is easy to compile on many other platforms too &#8211; I often run it on AIX. The <strong>jqFilt<\/strong> file passed to jq is just a program executed by jq to tell it how to process the input JSON records.<\/p>\n<h3>The filter script<\/h3>\n<p>Although it might appear complicated at first glance, the program that jq runs is actually rather simple once you understand the principles. JSON fields are referenced by name, separated with a &#8216;.&#8217; for the nesting of objects within objects. Arrays can be handled too. There is a pipeline within the script, as JSON objects are selected or transformed, and passed to the next stage. There are functions such as <em>length<\/em> to work with the data. And the script language permits variables. In this program, variables are used to stash the application name which does not appear in the details of every individual MQI operation, but which is useful for each output line in the CSV format.<\/p>\n<p>The final step of this script formats the values in a JSON object as CSV. That conversion is a built-in function in jq. It deals with any special escape characters and getting the right levels of quotes.<\/p>\n<pre># The -r flag to jq removes one layer of quote characters from the output - better for CSV import\n# Operations are\n# 1. Select only activity trace records from stdin.\n# 2. Pull out the application name so that the lower entries can use it in the output.\n# 3. If there's an object name, print it; if not, we still print something to\n#    keep consistent columns.\n# 4. Put out extra fields for the get\/put verbs.\n# 5. Finally format the whole record as CSV.\n\nselect(.eventData.activityTrace != null) |\n      .eventData.applName as $applName |\n      (.eventData.activityTrace[] |\n         [\n           $applName,\n           .operationDate,\n           .operationTime,\n           .operationId,\n           .reasonCode.value,\n           if (.objectName | length) &gt; 0\n           then\n              .objectName\n           else\n              \"N\/A\"\n           end,\n           if .operationId == \"Get\" or\n              .operationId == \"Put\" or\n              .operationId == \"Put1\"\n           then\n              .qmgrOpDuration,\n              .msgId\n           else\n              empty\n           end\n         ]\n      ) |\n    @csv\n<\/pre>\n<h3>Imported CSV<\/h3>\n<p>And here we can see the data after it has been imported to a spreadsheet.<\/p>\n<figure id=\"attachment_12843\" aria-describedby=\"caption-attachment-12843\" style=\"width: 640px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/marketaylor.synology.me\/?attachment_id=376\"><img loading=\"lazy\" decoding=\"async\" class=\"size-large wp-image-12843\" src=\"https:\/\/marketaylor.synology.me\/wp-content\/uploads\/Pictures\/2019\/11\/activity-jq.png\" alt=\"Activity in a spreadsheet\" width=\"640\" height=\"198\" \/><\/a><figcaption id=\"caption-attachment-12843\" class=\"wp-caption-text\">Activity reports in spreadsheet<\/figcaption><\/figure>\n<h2>Conclusion<\/h2>\n<p>The full Application Activity Trace output can contain a lot more information than you might want to store long-term, and it can be tricky to process without specialised programs. I hope this article has shown how a couple of simple tools can make the job of selection and analysis much easier.<\/p>\n<p class=\"last-modified\" style=\"border:1px solid;padding: 10px;\">This post was last updated on November 25th, 2019 at 09:45 am<\/p>","protected":false},"excerpt":{"rendered":"<p>MQ Application Activity reports have a lot of detail. This post shows a simple way to extract key fields for simpler processing.<\/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":[39,41,35,38,20,40],"class_list":["post-373","post","type-post","status-publish","format-standard","hentry","category-mq","tag-auditing","tag-events","tag-ibmmq","tag-json","tag-mqseries","tag-pcf"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Application Activity - formatting and extracting key information - 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=373\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Application Activity - formatting and extracting key information - Mark Taylor&#039;s Blog\" \/>\n<meta property=\"og:description\" content=\"MQ Application Activity reports have a lot of detail. This post shows a simple way to extract key fields for simpler processing.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/marketaylor.synology.me\/?p=373\" \/>\n<meta property=\"og:site_name\" content=\"Mark Taylor&#039;s Blog\" \/>\n<meta property=\"article:published_time\" content=\"2018-07-31T16:53:46+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-11-25T09:45:23+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/marketaylor.synology.me\/wp-content\/uploads\/Pictures\/2019\/11\/activity-jq.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=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=373#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=373\"},\"author\":{\"name\":\"Mark\",\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/#\\\/schema\\\/person\\\/2d6f4113ff54187023e20c20186bbb3c\"},\"headline\":\"Application Activity &#8211; formatting and extracting key information\",\"datePublished\":\"2018-07-31T16:53:46+00:00\",\"dateModified\":\"2019-11-25T09:45:23+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=373\"},\"wordCount\":993,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=373#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/marketaylor.synology.me\\\/wp-content\\\/uploads\\\/Pictures\\\/2019\\\/11\\\/activity-jq.png\",\"keywords\":[\"auditing\",\"events\",\"ibmmq\",\"json\",\"mqseries\",\"pcf\"],\"articleSection\":[\"IBM MQ\"],\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/marketaylor.synology.me\\\/?p=373#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=373\",\"url\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=373\",\"name\":\"Application Activity - formatting and extracting key information - Mark Taylor&#039;s Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=373#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=373#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/marketaylor.synology.me\\\/wp-content\\\/uploads\\\/Pictures\\\/2019\\\/11\\\/activity-jq.png\",\"datePublished\":\"2018-07-31T16:53:46+00:00\",\"dateModified\":\"2019-11-25T09:45:23+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/#\\\/schema\\\/person\\\/2d6f4113ff54187023e20c20186bbb3c\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=373#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/marketaylor.synology.me\\\/?p=373\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=373#primaryimage\",\"url\":\"https:\\\/\\\/marketaylor.synology.me\\\/wp-content\\\/uploads\\\/Pictures\\\/2019\\\/11\\\/activity-jq.png\",\"contentUrl\":\"https:\\\/\\\/marketaylor.synology.me\\\/wp-content\\\/uploads\\\/Pictures\\\/2019\\\/11\\\/activity-jq.png\",\"width\":1135,\"height\":350},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=373#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/marketaylor.synology.me\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Application Activity &#8211; formatting and extracting key information\"}]},{\"@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":"Application Activity - formatting and extracting key information - 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=373","og_locale":"en_GB","og_type":"article","og_title":"Application Activity - formatting and extracting key information - Mark Taylor&#039;s Blog","og_description":"MQ Application Activity reports have a lot of detail. This post shows a simple way to extract key fields for simpler processing.","og_url":"https:\/\/marketaylor.synology.me\/?p=373","og_site_name":"Mark Taylor&#039;s Blog","article_published_time":"2018-07-31T16:53:46+00:00","article_modified_time":"2019-11-25T09:45:23+00:00","og_image":[{"url":"https:\/\/marketaylor.synology.me\/wp-content\/uploads\/Pictures\/2019\/11\/activity-jq.png","type":"","width":"","height":""}],"author":"Mark","twitter_card":"summary_large_image","twitter_creator":"@marketaylor","twitter_misc":{"Written by":"Mark","Estimated reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/marketaylor.synology.me\/?p=373#article","isPartOf":{"@id":"https:\/\/marketaylor.synology.me\/?p=373"},"author":{"name":"Mark","@id":"https:\/\/marketaylor.synology.me\/#\/schema\/person\/2d6f4113ff54187023e20c20186bbb3c"},"headline":"Application Activity &#8211; formatting and extracting key information","datePublished":"2018-07-31T16:53:46+00:00","dateModified":"2019-11-25T09:45:23+00:00","mainEntityOfPage":{"@id":"https:\/\/marketaylor.synology.me\/?p=373"},"wordCount":993,"commentCount":0,"image":{"@id":"https:\/\/marketaylor.synology.me\/?p=373#primaryimage"},"thumbnailUrl":"https:\/\/marketaylor.synology.me\/wp-content\/uploads\/Pictures\/2019\/11\/activity-jq.png","keywords":["auditing","events","ibmmq","json","mqseries","pcf"],"articleSection":["IBM MQ"],"inLanguage":"en-GB","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/marketaylor.synology.me\/?p=373#respond"]}]},{"@type":"WebPage","@id":"https:\/\/marketaylor.synology.me\/?p=373","url":"https:\/\/marketaylor.synology.me\/?p=373","name":"Application Activity - formatting and extracting key information - Mark Taylor&#039;s Blog","isPartOf":{"@id":"https:\/\/marketaylor.synology.me\/#website"},"primaryImageOfPage":{"@id":"https:\/\/marketaylor.synology.me\/?p=373#primaryimage"},"image":{"@id":"https:\/\/marketaylor.synology.me\/?p=373#primaryimage"},"thumbnailUrl":"https:\/\/marketaylor.synology.me\/wp-content\/uploads\/Pictures\/2019\/11\/activity-jq.png","datePublished":"2018-07-31T16:53:46+00:00","dateModified":"2019-11-25T09:45:23+00:00","author":{"@id":"https:\/\/marketaylor.synology.me\/#\/schema\/person\/2d6f4113ff54187023e20c20186bbb3c"},"breadcrumb":{"@id":"https:\/\/marketaylor.synology.me\/?p=373#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/marketaylor.synology.me\/?p=373"]}]},{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/marketaylor.synology.me\/?p=373#primaryimage","url":"https:\/\/marketaylor.synology.me\/wp-content\/uploads\/Pictures\/2019\/11\/activity-jq.png","contentUrl":"https:\/\/marketaylor.synology.me\/wp-content\/uploads\/Pictures\/2019\/11\/activity-jq.png","width":1135,"height":350},{"@type":"BreadcrumbList","@id":"https:\/\/marketaylor.synology.me\/?p=373#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/marketaylor.synology.me\/"},{"@type":"ListItem","position":2,"name":"Application Activity &#8211; formatting and extracting key information"}]},{"@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\/373","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=373"}],"version-history":[{"count":6,"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=\/wp\/v2\/posts\/373\/revisions"}],"predecessor-version":[{"id":560,"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=\/wp\/v2\/posts\/373\/revisions\/560"}],"wp:attachment":[{"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=373"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=373"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=373"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}