From ccfaa50de637ef7539b868d8c52795e57a478c53 Mon Sep 17 00:00:00 2001 From: Kodai Ishikawa Date: Tue, 16 Nov 2021 09:14:01 -0500 Subject: [PATCH 1/9] Added PTC tag to dashboards --- assets/11-Dashboards/D100-CacheDashboard.json | 3 +++ assets/11-Dashboards/D202-WorkspaceOperations.json | 3 +++ assets/11-Dashboards/M101-MSStatus.json | 3 +++ assets/11-Dashboards/M103-SMStatus.json | 3 +++ assets/11-Dashboards/M105-ProcessQueues.json | 3 +++ assets/11-Dashboards/M106-PublishQueues.json | 3 +++ assets/11-Dashboards/M107-ScheduleQueues.json | 3 +++ assets/11-Dashboards/M108-WindchillApplicationOverview.json | 3 +++ assets/11-Dashboards/M109-HOSTHealth.json | 3 +++ assets/11-Dashboards/M200-JVMHealth.json | 3 +++ assets/11-Dashboards/M201-HOSTWindchillMonitoring.json | 3 +++ assets/11-Dashboards/PTCWindchillUserData.json | 3 +++ 12 files changed, 36 insertions(+) diff --git a/assets/11-Dashboards/D100-CacheDashboard.json b/assets/11-Dashboards/D100-CacheDashboard.json index f8493d5..e5cdc28 100644 --- a/assets/11-Dashboards/D100-CacheDashboard.json +++ b/assets/11-Dashboards/D100-CacheDashboard.json @@ -10,6 +10,9 @@ "shared": true, "owner": "Dynatrace", "dashboardFilter": null, + "tags": [ + "PTC" + ], "preset": true }, "tiles": [ diff --git a/assets/11-Dashboards/D202-WorkspaceOperations.json b/assets/11-Dashboards/D202-WorkspaceOperations.json index 2179c5e..e6a2d21 100644 --- a/assets/11-Dashboards/D202-WorkspaceOperations.json +++ b/assets/11-Dashboards/D202-WorkspaceOperations.json @@ -10,6 +10,9 @@ "shared": true, "owner": "Dynatrace", "dashboardFilter": null, + "tags": [ + "PTC" + ], "preset": true }, "tiles": [ diff --git a/assets/11-Dashboards/M101-MSStatus.json b/assets/11-Dashboards/M101-MSStatus.json index c77aacf..6859202 100644 --- a/assets/11-Dashboards/M101-MSStatus.json +++ b/assets/11-Dashboards/M101-MSStatus.json @@ -10,6 +10,9 @@ "shared": true, "owner": "Dynatrace", "dashboardFilter": null, + "tags": [ + "PTC" + ], "preset": true }, "tiles": [ diff --git a/assets/11-Dashboards/M103-SMStatus.json b/assets/11-Dashboards/M103-SMStatus.json index 2449891..bcef0c6 100644 --- a/assets/11-Dashboards/M103-SMStatus.json +++ b/assets/11-Dashboards/M103-SMStatus.json @@ -10,6 +10,9 @@ "shared": true, "owner": "Dynatrace", "dashboardFilter": null, + "tags": [ + "PTC" + ], "preset": true }, "tiles": [ diff --git a/assets/11-Dashboards/M105-ProcessQueues.json b/assets/11-Dashboards/M105-ProcessQueues.json index 5aa3238..baf3a56 100644 --- a/assets/11-Dashboards/M105-ProcessQueues.json +++ b/assets/11-Dashboards/M105-ProcessQueues.json @@ -10,6 +10,9 @@ "shared": true, "owner": "Dynatrace", "dashboardFilter": null, + "tags": [ + "PTC" + ], "preset": true }, "tiles": [ diff --git a/assets/11-Dashboards/M106-PublishQueues.json b/assets/11-Dashboards/M106-PublishQueues.json index 2ad6f24..4dbb7c6 100644 --- a/assets/11-Dashboards/M106-PublishQueues.json +++ b/assets/11-Dashboards/M106-PublishQueues.json @@ -10,6 +10,9 @@ "shared": true, "owner": "Dynatrace", "dashboardFilter": null, + "tags": [ + "PTC" + ], "preset": true }, "tiles": [ diff --git a/assets/11-Dashboards/M107-ScheduleQueues.json b/assets/11-Dashboards/M107-ScheduleQueues.json index a4b7511..e74ed87 100644 --- a/assets/11-Dashboards/M107-ScheduleQueues.json +++ b/assets/11-Dashboards/M107-ScheduleQueues.json @@ -10,6 +10,9 @@ "shared": true, "owner": "Dynatrace", "dashboardFilter": null, + "tags": [ + "PTC" + ], "preset": true }, "tiles": [ diff --git a/assets/11-Dashboards/M108-WindchillApplicationOverview.json b/assets/11-Dashboards/M108-WindchillApplicationOverview.json index f6865f0..8320cc9 100644 --- a/assets/11-Dashboards/M108-WindchillApplicationOverview.json +++ b/assets/11-Dashboards/M108-WindchillApplicationOverview.json @@ -10,6 +10,9 @@ "shared": true, "owner": "Dynatrace", "dashboardFilter": null, + "tags": [ + "PTC" + ], "preset": true }, "tiles": [ diff --git a/assets/11-Dashboards/M109-HOSTHealth.json b/assets/11-Dashboards/M109-HOSTHealth.json index 7597ed7..5f13acc 100644 --- a/assets/11-Dashboards/M109-HOSTHealth.json +++ b/assets/11-Dashboards/M109-HOSTHealth.json @@ -10,6 +10,9 @@ "shared": true, "owner": "Dynatrace", "dashboardFilter": null, + "tags": [ + "PTC" + ], "preset": true }, "tiles": [ diff --git a/assets/11-Dashboards/M200-JVMHealth.json b/assets/11-Dashboards/M200-JVMHealth.json index 92cd512..5f61ad7 100644 --- a/assets/11-Dashboards/M200-JVMHealth.json +++ b/assets/11-Dashboards/M200-JVMHealth.json @@ -10,6 +10,9 @@ "shared": true, "owner": "Dynatrace", "dashboardFilter": null, + "tags": [ + "PTC" + ], "preset": true }, "tiles": [ diff --git a/assets/11-Dashboards/M201-HOSTWindchillMonitoring.json b/assets/11-Dashboards/M201-HOSTWindchillMonitoring.json index ca0ab6f..ee663fe 100644 --- a/assets/11-Dashboards/M201-HOSTWindchillMonitoring.json +++ b/assets/11-Dashboards/M201-HOSTWindchillMonitoring.json @@ -10,6 +10,9 @@ "shared": true, "owner": "Dynatrace", "dashboardFilter": null, + "tags": [ + "PTC" + ], "preset": true }, "tiles": [ diff --git a/assets/11-Dashboards/PTCWindchillUserData.json b/assets/11-Dashboards/PTCWindchillUserData.json index 86bd974..e36c3d9 100644 --- a/assets/11-Dashboards/PTCWindchillUserData.json +++ b/assets/11-Dashboards/PTCWindchillUserData.json @@ -10,6 +10,9 @@ "shared": true, "owner": "Dynatrace", "dashboardFilter": null, + "tags": [ + "PTC" + ], "preset": true }, "tiles": [ From f88b04051abf03edac03a97d2aacd7965ca68e0e Mon Sep 17 00:00:00 2001 From: Kodai Ishikawa Date: Tue, 16 Nov 2021 10:37:29 -0500 Subject: [PATCH 2/9] Added new custom services Added/Modified Windchill specific custom services based off of customer feedback --- .../{Checkin.json => CheckinOperation.json} | 101 ++++++++- assets/07-CustomServices/Checkout.json | 84 -------- .../07-CustomServices/CheckoutOperation.json | 193 ++++++++++++++++++ assets/07-CustomServices/CopyOperation.json | 55 +++++ .../CreateDocumentOperation.json | 31 +++ assets/07-CustomServices/CreateOperation.json | 63 ++++++ assets/07-CustomServices/DeleteOperation.json | 27 +++ assets/07-CustomServices/EditOperation.json | 31 +++ .../07-CustomServices/FolderNavigation.json | 30 +++ assets/07-CustomServices/MoveOperation.json | 33 +++ assets/07-CustomServices/PasteOperation.json | 31 +++ assets/07-CustomServices/RenameOperation.json | 31 +++ .../SetPreferenceOperation.json | 31 +++ assets/07-CustomServices/WCLoginBean.json | 33 +++ 14 files changed, 688 insertions(+), 86 deletions(-) rename assets/07-CustomServices/{Checkin.json => CheckinOperation.json} (54%) delete mode 100644 assets/07-CustomServices/Checkout.json create mode 100644 assets/07-CustomServices/CheckoutOperation.json create mode 100644 assets/07-CustomServices/CopyOperation.json create mode 100644 assets/07-CustomServices/CreateDocumentOperation.json create mode 100644 assets/07-CustomServices/CreateOperation.json create mode 100644 assets/07-CustomServices/DeleteOperation.json create mode 100644 assets/07-CustomServices/EditOperation.json create mode 100644 assets/07-CustomServices/FolderNavigation.json create mode 100644 assets/07-CustomServices/MoveOperation.json create mode 100644 assets/07-CustomServices/PasteOperation.json create mode 100644 assets/07-CustomServices/RenameOperation.json create mode 100644 assets/07-CustomServices/SetPreferenceOperation.json create mode 100644 assets/07-CustomServices/WCLoginBean.json diff --git a/assets/07-CustomServices/Checkin.json b/assets/07-CustomServices/CheckinOperation.json similarity index 54% rename from assets/07-CustomServices/Checkin.json rename to assets/07-CustomServices/CheckinOperation.json index d5b4d32..d31b838 100644 --- a/assets/07-CustomServices/Checkin.json +++ b/assets/07-CustomServices/CheckinOperation.json @@ -3,9 +3,9 @@ "configurationVersions": [ 0 ], - "clusterVersion": "1.211.90.20210216-141629" + "clusterVersion": "1.230.90.20211115-023414" }, - "name": "CheckIn", + "name": "Checkin Operation", "enabled": true, "rules": [ { @@ -102,6 +102,103 @@ } ], "annotations": [] + }, + { + "enabled": true, + "fileName": "", + "className": "wt.vc.wip.StandardWorkInProgressService", + "matcher": "EQUALS", + "methodRules": [ + { + "methodName": "checkin", + "argumentTypes": [ + "wt.fc.collections.WTKeyedMap" + ], + "returnType": "wt.fc.collections.WTCollection" + }, + { + "methodName": "checkin", + "argumentTypes": [ + "wt.vc.wip.Workable", + "java.lang.String" + ], + "returnType": "wt.vc.wip.Workable" + }, + { + "methodName": "checkin", + "argumentTypes": [ + "wt.fc.collections.WTKeyedMap", + "wt.folder.Folder" + ], + "returnType": "wt.fc.collections.WTCollection" + }, + { + "methodName": "checkin", + "argumentTypes": [ + "wt.fc.collections.WTCollection", + "java.lang.String", + "java.lang.String" + ], + "returnType": "wt.fc.collections.WTCollection" + }, + { + "methodName": "checkin", + "argumentTypes": [ + "wt.vc.wip.Workable", + "java.lang.String", + "boolean" + ], + "returnType": "wt.vc.wip.Workable" + }, + { + "methodName": "checkin", + "argumentTypes": [ + "wt.fc.collections.WTKeyedMap", + "boolean" + ], + "returnType": "wt.fc.collections.WTCollection" + }, + { + "methodName": "checkin", + "argumentTypes": [ + "wt.fc.collections.WTCollection", + "java.lang.String" + ], + "returnType": "wt.fc.collections.WTCollection" + }, + { + "methodName": "checkin", + "argumentTypes": [ + "wt.fc.collections.WTCollection" + ], + "returnType": "void" + }, + { + "methodName": "checkin", + "argumentTypes": [ + "wt.fc.collections.WTKeyedMap", + "wt.fc.collections.WTValuedMap" + ], + "returnType": "wt.fc.collections.WTCollection" + }, + { + "methodName": "checkin", + "argumentTypes": [ + "wt.fc.WTObject" + ], + "returnType": "void" + }, + { + "methodName": "checkin", + "argumentTypes": [ + "wt.fc.collections.WTCollection", + "java.lang.String", + "wt.folder.Folder" + ], + "returnType": "wt.fc.collections.WTCollection" + } + ], + "annotations": [] } ], "queueEntryPoint": false, diff --git a/assets/07-CustomServices/Checkout.json b/assets/07-CustomServices/Checkout.json deleted file mode 100644 index 1d3f2ac..0000000 --- a/assets/07-CustomServices/Checkout.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "metadata": { - "configurationVersions": [ - 0 - ], - "clusterVersion": "1.211.90.20210216-141629" - }, - "name": "CheckOut", - "enabled": true, - "rules": [ - { - "enabled": true, - "fileName": "", - "className": "wt.epm.workspaces.EPMStandardWorkspaceManager", - "matcher": "EQUALS", - "methodRules": [ - { - "methodName": "checkout", - "argumentTypes": [ - "wt.epm.workspaces.EPMWorkspace", - "wt.fc.collections.WTCollection", - "wt.vc.wip.WorkInProgressState" - ], - "returnType": "wt.fc.collections.WTValuedMap" - }, - { - "methodName": "checkout", - "argumentTypes": [ - "wt.epm.workspaces.EPMWorkspace", - "wt.fc.collections.WTCollection" - ], - "returnType": "wt.fc.collections.WTValuedMap" - } - ], - "annotations": [] - }, - { - "enabled": true, - "fileName": "", - "className": "wt.epm.workspaces.EPMWorkspaceManager", - "matcher": "EQUALS", - "methodRules": [ - { - "methodName": "checkout", - "argumentTypes": [ - "wt.epm.workspaces.EPMWorkspace", - "wt.fc.collections.WTCollection", - "wt.vc.wip.WorkInProgressState" - ], - "returnType": "wt.fc.collections.WTValuedMap" - }, - { - "methodName": "checkout", - "argumentTypes": [ - "wt.epm.workspaces.EPMWorkspace", - "wt.fc.collections.WTCollection" - ], - "returnType": "wt.fc.collections.WTValuedMap" - } - ], - "annotations": [] - }, - { - "enabled": true, - "fileName": "", - "className": "com.ptc.windchill.enterprise.wip.CheckoutObjectFormProcessor", - "matcher": "EQUALS", - "methodRules": [ - { - "methodName": "doOperation", - "argumentTypes": [ - "com.ptc.netmarkets.util.beans.NmCommandBean", - "java.util.List" - ], - "returnType": "com.ptc.core.components.forms.FormResult" - } - ], - "annotations": [] - } - ], - "queueEntryPoint": false, - "queueEntryPointType": null, - "processGroups": [] -} \ No newline at end of file diff --git a/assets/07-CustomServices/CheckoutOperation.json b/assets/07-CustomServices/CheckoutOperation.json new file mode 100644 index 0000000..445d4e4 --- /dev/null +++ b/assets/07-CustomServices/CheckoutOperation.json @@ -0,0 +1,193 @@ +{ + "metadata": { + "configurationVersions": [ + 0 + ], + "clusterVersion": "1.230.90.20211115-023414" + }, + "name": "Checkout Operation", + "enabled": true, + "rules": [ + { + "enabled": true, + "fileName": "", + "className": "wt.epm.workspaces.EPMStandardWorkspaceManager", + "matcher": "EQUALS", + "methodRules": [ + { + "methodName": "checkout", + "argumentTypes": [ + "wt.epm.workspaces.EPMWorkspace", + "wt.fc.collections.WTCollection", + "wt.vc.wip.WorkInProgressState" + ], + "returnType": "wt.fc.collections.WTValuedMap" + }, + { + "methodName": "checkout", + "argumentTypes": [ + "wt.epm.workspaces.EPMWorkspace", + "wt.fc.collections.WTCollection" + ], + "returnType": "wt.fc.collections.WTValuedMap" + } + ], + "annotations": [] + }, + { + "enabled": true, + "fileName": "", + "className": "wt.epm.workspaces.EPMWorkspaceManager", + "matcher": "EQUALS", + "methodRules": [ + { + "methodName": "checkout", + "argumentTypes": [ + "wt.epm.workspaces.EPMWorkspace", + "wt.fc.collections.WTCollection", + "wt.vc.wip.WorkInProgressState" + ], + "returnType": "wt.fc.collections.WTValuedMap" + }, + { + "methodName": "checkout", + "argumentTypes": [ + "wt.epm.workspaces.EPMWorkspace", + "wt.fc.collections.WTCollection" + ], + "returnType": "wt.fc.collections.WTValuedMap" + } + ], + "annotations": [] + }, + { + "enabled": true, + "fileName": "", + "className": "com.ptc.windchill.enterprise.wip.CheckoutObjectFormProcessor", + "matcher": "EQUALS", + "methodRules": [ + { + "methodName": "doOperation", + "argumentTypes": [ + "com.ptc.netmarkets.util.beans.NmCommandBean", + "java.util.List" + ], + "returnType": "com.ptc.core.components.forms.FormResult" + } + ], + "annotations": [] + }, + { + "enabled": true, + "fileName": "", + "className": "wt.vc.wip.StandardWorkInProgressService", + "matcher": "EQUALS", + "methodRules": [ + { + "methodName": "checkout", + "argumentTypes": [ + "wt.vc.wip.Workable", + "wt.folder.Folder", + "java.lang.String", + "boolean", + "boolean" + ], + "returnType": "wt.vc.wip.CheckoutLink" + }, + { + "methodName": "checkout", + "argumentTypes": [ + "wt.fc.collections.WTCollection", + "wt.folder.Folder", + "java.lang.String", + "boolean" + ], + "returnType": "wt.fc.collections.WTCollection" + }, + { + "methodName": "checkout", + "argumentTypes": [ + "wt.vc.wip.Workable", + "wt.folder.Folder", + "java.lang.String" + ], + "returnType": "wt.vc.wip.CheckoutLink" + }, + { + "methodName": "checkout", + "argumentTypes": [ + "wt.vc.wip.Workable", + "wt.folder.Folder", + "java.lang.String", + "wt.vc.wip.WorkInProgressState" + ], + "returnType": "wt.vc.wip.CheckoutLink" + }, + { + "methodName": "checkout", + "argumentTypes": [ + "wt.fc.collections.WTCollection", + "wt.folder.Folder", + "java.lang.String", + "boolean", + "wt.vc.wip.WorkInProgressState" + ], + "returnType": "wt.fc.collections.WTCollection" + }, + { + "methodName": "checkout", + "argumentTypes": [ + "wt.fc.WTObject" + ], + "returnType": "void" + }, + { + "methodName": "checkout", + "argumentTypes": [ + "wt.vc.wip.Workable", + "wt.folder.Folder", + "java.lang.String", + "boolean" + ], + "returnType": "wt.vc.wip.CheckoutLink" + }, + { + "methodName": "checkout", + "argumentTypes": [ + "wt.fc.collections.WTCollection", + "boolean" + ], + "returnType": "void" + }, + { + "methodName": "checkout", + "argumentTypes": [ + "wt.fc.collections.WTCollection" + ], + "returnType": "void" + }, + { + "methodName": "checkout", + "argumentTypes": [ + "wt.vc.wip.Workable", + "boolean" + ], + "returnType": "void" + }, + { + "methodName": "checkout", + "argumentTypes": [ + "wt.fc.collections.WTCollection", + "wt.folder.Folder", + "java.lang.String" + ], + "returnType": "wt.fc.collections.WTCollection" + } + ], + "annotations": [] + } + ], + "queueEntryPoint": false, + "queueEntryPointType": null, + "processGroups": [] +} \ No newline at end of file diff --git a/assets/07-CustomServices/CopyOperation.json b/assets/07-CustomServices/CopyOperation.json new file mode 100644 index 0000000..e6e9e7b --- /dev/null +++ b/assets/07-CustomServices/CopyOperation.json @@ -0,0 +1,55 @@ +{ + "metadata": { + "configurationVersions": [ + 0 + ], + "clusterVersion": "1.224.83.20210902-162137" + }, + "name": "Copy Operation", + "enabled": true, + "rules": [ + { + "enabled": true, + "className": "com.ptc.netmarkets.model.NmObjectCommands", + "matcher": "EQUALS", + "methodRules": [ + { + "methodName": "copy", + "argumentTypes": [ + "com.ptc.netmarkets.util.beans.NmCommandBean" + ], + "returnType": "com.ptc.netmarkets.util.table.NmHTMLTable" + }, + { + "methodName": "list_copy", + "argumentTypes": [ + "com.ptc.netmarkets.util.beans.NmCommandBean" + ], + "returnType": "com.ptc.netmarkets.util.table.NmHTMLTable" + } + ], + "annotations": [] + }, + { + "enabled": true, + "className": "com.ptc.netmarkets.model.StandardNmObjectService", + "matcher": "EQUALS", + "methodRules": [ + { + "methodName": "getPSPart", + "argumentTypes": [ + "java.lang.String", + "java.lang.String", + "java.lang.String", + "java.util.ArrayList" + ], + "returnType": "java.util.ArrayList" + } + ], + "annotations": [] + } + ], + "queueEntryPoint": false, + "queueEntryPointType": null, + "processGroups": [] +} \ No newline at end of file diff --git a/assets/07-CustomServices/CreateDocumentOperation.json b/assets/07-CustomServices/CreateDocumentOperation.json new file mode 100644 index 0000000..e29deb2 --- /dev/null +++ b/assets/07-CustomServices/CreateDocumentOperation.json @@ -0,0 +1,31 @@ +{ + "metadata": { + "configurationVersions": [ + 0 + ], + "clusterVersion": "1.224.83.20210902-162137" + }, + "name": "Create Document Operation", + "enabled": true, + "rules": [ + { + "enabled": true, + "className": "com.ptc.windchill.enterprise.doc.forms.CreateDocFormProcessor", + "matcher": "EQUALS", + "methodRules": [ + { + "methodName": "doOperation", + "argumentTypes": [ + "com.ptc.netmarkets.util.beans.NmCommandBean", + "java.util.List" + ], + "returnType": "com.ptc.core.components.forms.FormResult" + } + ], + "annotations": [] + } + ], + "queueEntryPoint": false, + "queueEntryPointType": null, + "processGroups": [] +} \ No newline at end of file diff --git a/assets/07-CustomServices/CreateOperation.json b/assets/07-CustomServices/CreateOperation.json new file mode 100644 index 0000000..d4d981e --- /dev/null +++ b/assets/07-CustomServices/CreateOperation.json @@ -0,0 +1,63 @@ +{ + "metadata": { + "configurationVersions": [ + 0 + ], + "clusterVersion": "1.224.83.20210902-162137" + }, + "name": "Create Operation", + "enabled": true, + "rules": [ + { + "enabled": true, + "className": "com.ptc.core.components.forms.CreateObjectFormProcessor", + "matcher": "EQUALS", + "methodRules": [ + { + "methodName": "doOperation", + "argumentTypes": [ + "com.ptc.netmarkets.util.beans.NmCommandBean", + "java.util.List" + ], + "returnType": "com.ptc.core.components.forms.FormResult" + } + ], + "annotations": [] + }, + { + "enabled": true, + "className": "com.ptc.windchill.enterprise.change2.forms.processors.CreateChangeItemFormProcessor", + "matcher": "EQUALS", + "methodRules": [ + { + "methodName": "doOperation", + "argumentTypes": [ + "com.ptc.netmarkets.util.beans.NmCommandBean", + "java.util.List" + ], + "returnType": "com.ptc.core.components.forms.FormResult" + } + ], + "annotations": [] + }, + { + "enabled": true, + "className": "com.ptc.windchill.enterprise.doc.forms.CreateDocFormProcessor", + "matcher": "EQUALS", + "methodRules": [ + { + "methodName": "doOperation", + "argumentTypes": [ + "com.ptc.netmarkets.util.beans.NmCommandBean", + "java.util.List" + ], + "returnType": "com.ptc.core.components.forms.FormResult" + } + ], + "annotations": [] + } + ], + "queueEntryPoint": false, + "queueEntryPointType": null, + "processGroups": [] +} \ No newline at end of file diff --git a/assets/07-CustomServices/DeleteOperation.json b/assets/07-CustomServices/DeleteOperation.json new file mode 100644 index 0000000..a629c39 --- /dev/null +++ b/assets/07-CustomServices/DeleteOperation.json @@ -0,0 +1,27 @@ +{ + "metadata": { + "configurationVersions": [ + 0 + ], + "clusterVersion": "1.224.83.20210902-162137" + }, + "name": "Delete Operation", + "enabled": true, + "rules": [ + { + "enabled": true, + "className": "wt.dataops.delete.DeleteTask", + "matcher": "EQUALS", + "methodRules": [ + { + "methodName": "_run", + "returnType": "com.ptc.core.task.TaskResult" + } + ], + "annotations": [] + } + ], + "queueEntryPoint": false, + "queueEntryPointType": null, + "processGroups": [] +} \ No newline at end of file diff --git a/assets/07-CustomServices/EditOperation.json b/assets/07-CustomServices/EditOperation.json new file mode 100644 index 0000000..e8f84d4 --- /dev/null +++ b/assets/07-CustomServices/EditOperation.json @@ -0,0 +1,31 @@ +{ + "metadata": { + "configurationVersions": [ + 0 + ], + "clusterVersion": "1.224.83.20210902-162137" + }, + "name": "Edit Operation", + "enabled": true, + "rules": [ + { + "enabled": true, + "className": "com.ptc.core.components.forms.DefaultEditFormProcessor", + "matcher": "EQUALS", + "methodRules": [ + { + "methodName": "doOperation", + "argumentTypes": [ + "com.ptc.netmarkets.util.beans.NmCommandBean", + "java.util.List" + ], + "returnType": "com.ptc.core.components.forms.FormResult" + } + ], + "annotations": [] + } + ], + "queueEntryPoint": false, + "queueEntryPointType": null, + "processGroups": [] +} \ No newline at end of file diff --git a/assets/07-CustomServices/FolderNavigation.json b/assets/07-CustomServices/FolderNavigation.json new file mode 100644 index 0000000..1205a56 --- /dev/null +++ b/assets/07-CustomServices/FolderNavigation.json @@ -0,0 +1,30 @@ +{ + "metadata": { + "configurationVersions": [ + 0 + ], + "clusterVersion": "1.224.83.20210902-162137" + }, + "name": "Folder Navigation", + "enabled": true, + "rules": [ + { + "enabled": true, + "className": "com.ptc.windchill.enterprise.folder.mvc.builders.FolderTableBuilder", + "matcher": "EQUALS", + "methodRules": [ + { + "methodName": "buildComponentConfig", + "argumentTypes": [ + "com.ptc.mvc.components.ComponentParams" + ], + "returnType": "com.ptc.mvc.components.ComponentConfig" + } + ], + "annotations": [] + } + ], + "queueEntryPoint": false, + "queueEntryPointType": null, + "processGroups": [] +} \ No newline at end of file diff --git a/assets/07-CustomServices/MoveOperation.json b/assets/07-CustomServices/MoveOperation.json new file mode 100644 index 0000000..523bb23 --- /dev/null +++ b/assets/07-CustomServices/MoveOperation.json @@ -0,0 +1,33 @@ +{ + "metadata": { + "configurationVersions": [ + 0 + ], + "clusterVersion": "1.224.83.20210902-162137" + }, + "name": "Move Operation", + "enabled": true, + "rules": [ + { + "enabled": true, + "className": "wt.dataops.containermove.StandardContainerMoveService", + "matcher": "EQUALS", + "methodRules": [ + { + "methodName": "moveImpl", + "argumentTypes": [ + "wt.fc.collections.WTValuedMap", + "boolean", + "boolean", + "java.lang.String" + ], + "returnType": "wt.fc.collections.WTCollection" + } + ], + "annotations": [] + } + ], + "queueEntryPoint": false, + "queueEntryPointType": null, + "processGroups": [] +} \ No newline at end of file diff --git a/assets/07-CustomServices/PasteOperation.json b/assets/07-CustomServices/PasteOperation.json new file mode 100644 index 0000000..a1bb2cb --- /dev/null +++ b/assets/07-CustomServices/PasteOperation.json @@ -0,0 +1,31 @@ +{ + "metadata": { + "configurationVersions": [ + 0 + ], + "clusterVersion": "1.224.83.20210902-162137" + }, + "name": "Paste Operation", + "enabled": true, + "rules": [ + { + "enabled": true, + "className": "com.ptc.windchill.pdmlink.object.operations.pasteAsCopy.forms.PasteFormProcessor", + "matcher": "EQUALS", + "methodRules": [ + { + "methodName": "doOperation", + "argumentTypes": [ + "com.ptc.netmarkets.util.beans.NmCommandBean", + "java.util.List" + ], + "returnType": "com.ptc.core.components.forms.FormResult" + } + ], + "annotations": [] + } + ], + "queueEntryPoint": false, + "queueEntryPointType": null, + "processGroups": [] +} \ No newline at end of file diff --git a/assets/07-CustomServices/RenameOperation.json b/assets/07-CustomServices/RenameOperation.json new file mode 100644 index 0000000..6862e60 --- /dev/null +++ b/assets/07-CustomServices/RenameOperation.json @@ -0,0 +1,31 @@ +{ + "metadata": { + "configurationVersions": [ + 0 + ], + "clusterVersion": "1.224.83.20210902-162137" + }, + "name": "Rename Operation", + "enabled": true, + "rules": [ + { + "enabled": true, + "className": "com.ptc.windchill.enterprise.object.forms.RenameObjectFormProcessor", + "matcher": "EQUALS", + "methodRules": [ + { + "methodName": "doOperation", + "argumentTypes": [ + "com.ptc.netmarkets.util.beans.NmCommandBean", + "java.util.List" + ], + "returnType": "com.ptc.core.components.forms.FormResult" + } + ], + "annotations": [] + } + ], + "queueEntryPoint": false, + "queueEntryPointType": null, + "processGroups": [] +} \ No newline at end of file diff --git a/assets/07-CustomServices/SetPreferenceOperation.json b/assets/07-CustomServices/SetPreferenceOperation.json new file mode 100644 index 0000000..e87e608 --- /dev/null +++ b/assets/07-CustomServices/SetPreferenceOperation.json @@ -0,0 +1,31 @@ +{ + "metadata": { + "configurationVersions": [ + 0 + ], + "clusterVersion": "1.224.83.20210902-162137" + }, + "name": "Set Preference Operation", + "enabled": true, + "rules": [ + { + "enabled": true, + "className": "com.ptc.windchill.enterprise.preference.forms.SetPreferenceValueFormProcessor", + "matcher": "EQUALS", + "methodRules": [ + { + "methodName": "doOperation", + "argumentTypes": [ + "com.ptc.netmarkets.util.beans.NmCommandBean", + "java.util.List" + ], + "returnType": "com.ptc.core.components.forms.FormResult" + } + ], + "annotations": [] + } + ], + "queueEntryPoint": false, + "queueEntryPointType": null, + "processGroups": [] +} \ No newline at end of file diff --git a/assets/07-CustomServices/WCLoginBean.json b/assets/07-CustomServices/WCLoginBean.json new file mode 100644 index 0000000..5143652 --- /dev/null +++ b/assets/07-CustomServices/WCLoginBean.json @@ -0,0 +1,33 @@ +{ + "metadata": { + "configurationVersions": [ + 0 + ], + "clusterVersion": "1.224.83.20210902-162137" + }, + "name": "WC LoginBean", + "enabled": true, + "rules": [ + { + "enabled": true, + "fileName": "", + "className": "com.ptc.netmarkets.util.beans.NmLoginBean", + "matcher": "EQUALS", + "methodRules": [ + { + "methodName": "getRemoteUser", + "argumentTypes": [], + "returnType": "java.lang.String" + }, + { + "methodName": "", + "returnType": "void" + } + ], + "annotations": [] + } + ], + "queueEntryPoint": false, + "queueEntryPointType": null, + "processGroups": [] +} \ No newline at end of file From d531cf78d6d21767d593c75a0bf3ce0111b39ff0 Mon Sep 17 00:00:00 2001 From: Kodai Ishikawa Date: Tue, 16 Nov 2021 11:45:13 -0500 Subject: [PATCH 3/9] Updated main.go Removed old commented sharing details code and added input check to remove trailing slash in URL if it exists --- main.go | 47 +++-------------------------------------------- 1 file changed, 3 insertions(+), 44 deletions(-) diff --git a/main.go b/main.go index 4bbad1e..222daa8 100644 --- a/main.go +++ b/main.go @@ -84,6 +84,9 @@ func (p *Processor) Process() error { if folders, err = p.readDir(string(rootDir), endpoints.Contains); err != nil { return err } + + // Remove trailing slash in URL if it exists + p.Config.URL = strings.TrimRight(p.Config.URL, "/") // Perform an early sanity check without sending anything // Benefit: If some of the folders or files are illegal/flawed nothing has been sent yet @@ -133,17 +136,6 @@ func (p *Processor) Process() error { if err = p.post(endpointName, endpointURL, data); err != nil { return err } - - // Sharingdetails API no longer required, configuring dashboards as preset which are visible to all users by default. - // if endpointName == "Dashboards" { - // time.Sleep(10 * time.Second) - // if p.Config.Verbose { - // log.Println("Sending sharing data") - // } - // if err := p.sendSharingDetails(id); err != nil { - // return err - // } - // } } } return nil @@ -189,39 +181,6 @@ func (p *Processor) setupHTTPRequest(method string, endpointURL string, data []b return req, nil } -func (p *Processor) sendSharingDetails(dashboardID string) error { - var err error - endpointURL := endpoints["DashboardSharingDetails"] - replacedURL := p.Config.URL + strings.Replace(endpointURL, "{id}", dashboardID, 1) - sharingDetails := SharingDetails{ - ID: dashboardID, - Published: true, - Enabled: true, - Permissions: []Permission{{Type: "ALL", Permission: "VIEW"}}, - PublicAccess: PublicAccess{ManagementZoneIDs: []string{}}, - } - var data []byte - if data, err = json.Marshal(&sharingDetails); err != nil { - return err - } - // data := "{\"id\": \"{id}\",\"enabled\": true,\"published\": true,\"permissions\": [{\"type\": \"ALL\",\"permission\": \"VIEW\"}],\"publicAccess\": {\"managementZoneIds\": [],\"urls\": {}}}" - // replacedData := strings.Replace(data, "{id}", dashboardID, 1) - //fmt.Printf("replacedData=%s, replacedURL=%s\n", replacedData, replacedURL) - var req *http.Request - if req, err = p.setupHTTPRequest("PUT", replacedURL, []byte(data)); err != nil { - return err - } - var resp *http.Response - if resp, err = p.Client.Do(req); err != nil { - return err - } - defer resp.Body.Close() - if _, _, err = p.processResponse(resp, "DashboardSharingDetails"); err != nil { - return err - } - return nil -} - func (p *Processor) processResponse(resp *http.Response, endpointName string) (string, string, error) { fmt.Println("processResponse") body, _ := ioutil.ReadAll(resp.Body) From 3ef4069c9116ca9aafe36ca46d1440f44b06350d Mon Sep 17 00:00:00 2001 From: Kodai Ishikawa Date: Tue, 16 Nov 2021 12:07:20 -0500 Subject: [PATCH 4/9] Updated README.md Updated README to provide additional information --- README.md | 31 ++++++++++++------------------- 1 file changed, 12 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 1f401ee..31430f6 100644 --- a/README.md +++ b/README.md @@ -1,34 +1,30 @@ -# PTC-Windchill -This repo contains files that are required to create assets in a Dynatrace tenant including an application, metrics, dashboards and synthetic to monitor PTC Windchill. -In order to create these entities in Dynatrace, you would need 2 items: +# Dynatrace PTC Windchill Starter Set +This repo contains files to create PTC Windchill assets in a Dynatrace tenant including application, metrics, dashboards and synthetic monitors. Check out our Dynatrace blog on PTC Windchill/ThingWorx [here](https://www.dynatrace.com/news/blog/ai-driven-observability-for-ptc-windchill-thingworx/). +In order to create these entities in Dynatrace, you will need two items: Name | Description ------------ | ------------- Dynatrace tenant url | `Managed` https://{your-domain}/e/{your-environment-id}
`SaaS` https://{your-environment-id}.live.dynatrace.com -API Token | You need the Write configuration (WriteConfig) permission assigned to your API token +API Token | Required permissions outlined in the screenshot below The API Token needs to have these minimum permissions: -* Write Configuration -* Capture Request Data -* Write Entities -* Write Extensions ![GitHub Logo](/images/TokenPermissions.png) -All the relevant files required to create Dynatrace objects are in the **assets** directory. Under this directory, subfolders are available to create the relevant objects in Dynatrace. For example, all the files to create different dashboards are under Dashboards directory. Each subfolder is prefixed by a numeric value to show the order in which these objects need to be created. Since ManagementZones are created first, it is named as 01-ManagementZones. Note that some dashboards may require minor configuration after deployment - such as filtering a tile to a particular process group. +All the relevant files required to create the Dynatrace objects are in the **assets** directory. Under this directory, there are subfolders containing the assets by category. Each subfolder is prefixed by a numeric value to show the order in which these objects need to be created. Note that some dashboards may require minor configuration after deployment - such as filtering a tile to a particular process group. -Example synthetic monitors are available in the **synthetic** directory, please refer to the [README-Synthetic.md](https://github.com/dynatrace-oss/PTC-Windchill/tree/main/synthetic/README-Synthetic.md) - examples include remote file server, queue and server status monitors. +Example synthetic monitors are available in the **synthetic** directory, please refer to [README-Synthetic.md](https://github.com/dynatrace-oss/PTC-Windchill/tree/main/synthetic/README-Synthetic.md) - examples include remote file server, queue and server status monitors. + +There are two ways to deploy the assets to your Dynatrace tenant, with the utility tool or uploading the them manually. Each option is covered in more detail below. -There are 2 ways to create PTC related components to your Dynatrace tenant ### 1. Utility Tool -A utility tool is available to upload all the assets to the Dynatrace tenant. In order to use the utility: +A utility tool is available to automatically upload all the assets to the Dynatrace tenant. In order to use the utility: * Clone or download this repo. -* [Download](https://github.com/dynatrace-oss/PTC-Windchill/releases/latest) the utility for your OS. Unzip the file. Move the file PTC-Windchill_x.x.x to root of your cloned directory and run it. You will need Dynatrace tenant URL and the token for this utility to work. +* [Download](https://github.com/dynatrace-oss/PTC-Windchill/releases/latest) the utility for your OS. Unzip and move the file PTC-Windchill_x.x.x to the root of your cloned directory. To run the executable - open command prompt, navigate to the executable and run it. ### 2. Manually upload the components -* Please use any tool of your convenience (Postman, curl etc.) to make POST REST call to your Dynatrace tenant. Please use the tool of your choice to apply REST calls for all the files in a given subfolder. - +* Please use any tool of your convenience (Postman, curl etc.) to make POST REST calls to your Dynatrace tenant or utilize the API explorer in the Dynatrace UI. Apply all REST calls of the files in a given subfolder. Method | Endpoint | Subfolder Name | Notes ------------| ----------------------------------- | --------------- | ----------------------- @@ -39,11 +35,8 @@ POST | /api/config/v1/autoTags | 04-AutoTags | POST | /api/config/v1/service/requestAttributes | 05-RequestAttributes | POST | /api/config/v1/calculatedMetrics/service | 06-MetricsService | POST | /api/config/v1/service/customServices/java?position=APPEND | 07-CustomServices | -POST | /api/config/v1/extensions | 08-Extensions | Extensions require uploading of the zip file. +POST | /api/config/v1/extensions | 08-Extensions | Extensions require uploading the zip files POST | /api/config/v1/dashboards | 11-Dashboards -### Troubleshooting -Please open new issues if you encounter problems in uploading the components to Dynatrace or if there are missing functionalities for the PTC Windchill pack. - ### Contact Please reach out to PTC@dynatrace.com for assistance with deploying the starter set or for any questions/concerns From e92cd769bb173e0342a76c174f365d2ee647a1ce Mon Sep 17 00:00:00 2001 From: Kodai Ishikawa Date: Tue, 16 Nov 2021 14:06:04 -0500 Subject: [PATCH 5/9] Updated README.md Minor formatting fix --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 31430f6..004b025 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ # Dynatrace PTC Windchill Starter Set This repo contains files to create PTC Windchill assets in a Dynatrace tenant including application, metrics, dashboards and synthetic monitors. Check out our Dynatrace blog on PTC Windchill/ThingWorx [here](https://www.dynatrace.com/news/blog/ai-driven-observability-for-ptc-windchill-thingworx/). + In order to create these entities in Dynatrace, you will need two items: Name | Description From 795502161a86d2ac7a23b53aa2f766d1062fc928 Mon Sep 17 00:00:00 2001 From: Kodai Ishikawa Date: Wed, 17 Nov 2021 15:55:02 -0500 Subject: [PATCH 6/9] Updated WCLoginBean.json Minor change to the service name to match existing dashboard filters --- assets/07-CustomServices/WCLoginBean.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/07-CustomServices/WCLoginBean.json b/assets/07-CustomServices/WCLoginBean.json index 5143652..4214439 100644 --- a/assets/07-CustomServices/WCLoginBean.json +++ b/assets/07-CustomServices/WCLoginBean.json @@ -5,7 +5,7 @@ ], "clusterVersion": "1.224.83.20210902-162137" }, - "name": "WC LoginBean", + "name": "WC_LoginBean", "enabled": true, "rules": [ { From 48f27ed6ea7c316af88f6a1725f24e623173eba4 Mon Sep 17 00:00:00 2001 From: Kodai Ishikawa Date: Fri, 19 Nov 2021 09:24:06 -0500 Subject: [PATCH 7/9] Created PTC Windchill Operations dashboard Created PTC Windchill Operations dashboard based off of the new custom services. Removed PTC Windchill User Data dashboard since the new dashboard contains these metrics. --- .../11-Dashboards/PTCWindchillOperations.json | 927 ++++++++++++++++++ .../11-Dashboards/PTCWindchillUserData.json | 224 ----- 2 files changed, 927 insertions(+), 224 deletions(-) create mode 100644 assets/11-Dashboards/PTCWindchillOperations.json delete mode 100644 assets/11-Dashboards/PTCWindchillUserData.json diff --git a/assets/11-Dashboards/PTCWindchillOperations.json b/assets/11-Dashboards/PTCWindchillOperations.json new file mode 100644 index 0000000..f7dc819 --- /dev/null +++ b/assets/11-Dashboards/PTCWindchillOperations.json @@ -0,0 +1,927 @@ +{ + "metadata": { + "configurationVersions": [ + 5 + ], + "clusterVersion": "1.230.97.20211117-130823" + }, + "dashboardMetadata": { + "name": "PTC Windchill - Operations", + "shared": true, + "owner": "Dynatrace", + "tags": [ + "PTC" + ], + "preset": true + }, + "tiles": [ + { + "name": "", + "tileType": "DATA_EXPLORER", + "configured": true, + "bounds": { + "top": 38, + "left": 228, + "width": 304, + "height": 380 + }, + "tileFilter": {}, + "customName": "Data explorer results", + "queries": [ + { + "id": "A", + "metric": "builtin:service.requestCount.total", + "spaceAggregation": "AVG", + "timeAggregation": "DEFAULT", + "splitBy": [ + "dt.entity.service" + ], + "filterBy": { + "filterOperator": "AND", + "nestedFilters": [ + { + "filter": "dt.entity.service", + "filterType": "NAME", + "filterOperator": "OR", + "entityAttribute": "entityName", + "nestedFilters": [], + "criteria": [ + { + "value": "Set Preference Operation", + "evaluator": "IN" + }, + { + "value": "Edit Operation", + "evaluator": "IN" + }, + { + "value": "Copy Operation", + "evaluator": "IN" + }, + { + "value": "Paste Operation", + "evaluator": "IN" + }, + { + "value": "WC_LoginBean", + "evaluator": "IN" + }, + { + "value": "Delete Operation", + "evaluator": "IN" + }, + { + "value": "Checkin Operation", + "evaluator": "IN" + }, + { + "value": "Folder Navigation", + "evaluator": "IN" + }, + { + "value": "Rename Operation", + "evaluator": "IN" + }, + { + "value": "Create Document Operation", + "evaluator": "IN" + }, + { + "value": "Move Operation", + "evaluator": "IN" + }, + { + "value": "Create Operation", + "evaluator": "IN" + }, + { + "value": "Checkout Operation", + "evaluator": "IN" + } + ] + } + ], + "criteria": [] + }, + "enabled": true + } + ], + "visualConfig": { + "type": "TOP_LIST", + "global": { + "theme": "DEFAULT", + "seriesType": "LINE" + }, + "rules": [], + "axes": { + "xAxis": { + "visible": true + }, + "yAxes": [] + }, + "heatmapSettings": {}, + "thresholds": [], + "tableSettings": {}, + "graphChartSettings": { + "connectNulls": false + } + } + }, + { + "name": "", + "tileType": "DATA_EXPLORER", + "configured": true, + "bounds": { + "top": 38, + "left": 532, + "width": 570, + "height": 380 + }, + "tileFilter": {}, + "customName": "Data explorer results", + "queries": [ + { + "id": "A", + "metric": "builtin:service.requestCount.total", + "spaceAggregation": "AVG", + "timeAggregation": "DEFAULT", + "splitBy": [ + "dt.entity.service" + ], + "filterBy": { + "filterOperator": "AND", + "nestedFilters": [ + { + "filter": "dt.entity.service", + "filterType": "NAME", + "filterOperator": "OR", + "entityAttribute": "entityName", + "nestedFilters": [], + "criteria": [ + { + "value": "Create Document Operation", + "evaluator": "IN" + }, + { + "value": "Edit Operation", + "evaluator": "IN" + }, + { + "value": "Delete Operation", + "evaluator": "IN" + }, + { + "value": "Folder Navigation", + "evaluator": "IN" + }, + { + "value": "Create Operation", + "evaluator": "IN" + }, + { + "value": "Checkout Operation", + "evaluator": "IN" + }, + { + "value": "WC_LoginBean", + "evaluator": "IN" + }, + { + "value": "Paste Operation", + "evaluator": "IN" + }, + { + "value": "Checkin Operation", + "evaluator": "IN" + }, + { + "value": "Set Preference Operation", + "evaluator": "IN" + }, + { + "value": "Copy Operation", + "evaluator": "IN" + }, + { + "value": "Move Operation", + "evaluator": "IN" + }, + { + "value": "Rename Operation", + "evaluator": "IN" + } + ] + } + ], + "criteria": [] + }, + "enabled": true + } + ], + "visualConfig": { + "type": "GRAPH_CHART", + "global": { + "theme": "DEFAULT", + "seriesType": "LINE" + }, + "rules": [ + { + "matcher": "A:", + "properties": { + "seriesType": "COLUMN" + } + } + ], + "axes": { + "xAxis": { + "visible": true + }, + "yAxes": [] + }, + "heatmapSettings": {}, + "thresholds": [], + "tableSettings": {}, + "graphChartSettings": { + "connectNulls": false + } + } + }, + { + "name": "", + "tileType": "DATA_EXPLORER", + "configured": true, + "bounds": { + "top": 494, + "left": 228, + "width": 304, + "height": 380 + }, + "tileFilter": {}, + "customName": "Data explorer results", + "queries": [ + { + "id": "A", + "metric": "builtin:service.response.time", + "spaceAggregation": "AVG", + "timeAggregation": "DEFAULT", + "splitBy": [ + "dt.entity.service" + ], + "filterBy": { + "filterOperator": "AND", + "nestedFilters": [ + { + "filter": "dt.entity.service", + "filterType": "NAME", + "filterOperator": "OR", + "entityAttribute": "entityName", + "nestedFilters": [], + "criteria": [ + { + "value": "Checkout Operation", + "evaluator": "IN" + }, + { + "value": "WC_LoginBean", + "evaluator": "IN" + }, + { + "value": "Copy Operation", + "evaluator": "IN" + }, + { + "value": "Set Preference Operation", + "evaluator": "IN" + }, + { + "value": "Create Document Operation", + "evaluator": "IN" + }, + { + "value": "Rename Operation", + "evaluator": "IN" + }, + { + "value": "Move Operation", + "evaluator": "IN" + }, + { + "value": "Edit Operation", + "evaluator": "IN" + }, + { + "value": "Checkin Operation", + "evaluator": "IN" + }, + { + "value": "Paste Operation", + "evaluator": "IN" + }, + { + "value": "Folder Navigation", + "evaluator": "IN" + }, + { + "value": "Create Operation", + "evaluator": "IN" + }, + { + "value": "Delete Operation", + "evaluator": "IN" + } + ] + } + ], + "criteria": [] + }, + "enabled": true + } + ], + "visualConfig": { + "type": "TOP_LIST", + "global": { + "theme": "DEFAULT", + "seriesType": "LINE" + }, + "rules": [], + "axes": { + "xAxis": { + "visible": true + }, + "yAxes": [] + }, + "heatmapSettings": {}, + "thresholds": [], + "tableSettings": {}, + "graphChartSettings": { + "connectNulls": false + } + } + }, + { + "name": "", + "tileType": "DATA_EXPLORER", + "configured": true, + "bounds": { + "top": 494, + "left": 532, + "width": 570, + "height": 380 + }, + "tileFilter": {}, + "customName": "Data explorer results", + "queries": [ + { + "id": "A", + "metric": "builtin:service.response.time", + "spaceAggregation": "AVG", + "timeAggregation": "DEFAULT", + "splitBy": [ + "dt.entity.service" + ], + "filterBy": { + "filterOperator": "AND", + "nestedFilters": [ + { + "filter": "dt.entity.service", + "filterType": "NAME", + "filterOperator": "OR", + "entityAttribute": "entityName", + "nestedFilters": [], + "criteria": [ + { + "value": "Copy Operation", + "evaluator": "IN" + }, + { + "value": "Checkin Operation", + "evaluator": "IN" + }, + { + "value": "Folder Navigation", + "evaluator": "IN" + }, + { + "value": "Checkout Operation", + "evaluator": "IN" + }, + { + "value": "Delete Operation", + "evaluator": "IN" + }, + { + "value": "Paste Operation", + "evaluator": "IN" + }, + { + "value": "Move Operation", + "evaluator": "IN" + }, + { + "value": "WC_LoginBean", + "evaluator": "IN" + }, + { + "value": "Create Document Operation", + "evaluator": "IN" + }, + { + "value": "Edit Operation", + "evaluator": "IN" + }, + { + "value": "Rename Operation", + "evaluator": "IN" + }, + { + "value": "Set Preference Operation", + "evaluator": "IN" + }, + { + "value": "Create Operation", + "evaluator": "IN" + } + ] + } + ], + "criteria": [] + }, + "enabled": true + } + ], + "visualConfig": { + "type": "GRAPH_CHART", + "global": { + "theme": "DEFAULT", + "seriesType": "LINE" + }, + "rules": [], + "axes": { + "xAxis": { + "visible": true + }, + "yAxes": [] + }, + "heatmapSettings": {}, + "thresholds": [], + "tableSettings": {}, + "graphChartSettings": { + "connectNulls": false + } + } + }, + { + "name": "", + "tileType": "DATA_EXPLORER", + "configured": true, + "bounds": { + "top": 950, + "left": 228, + "width": 304, + "height": 380 + }, + "tileFilter": {}, + "customName": "Data explorer results", + "queries": [ + { + "id": "A", + "metric": "builtin:service.errors.total.rate", + "spaceAggregation": "AVG", + "timeAggregation": "DEFAULT", + "splitBy": [ + "dt.entity.service" + ], + "filterBy": { + "filterOperator": "AND", + "nestedFilters": [ + { + "filter": "dt.entity.service", + "filterType": "NAME", + "filterOperator": "OR", + "entityAttribute": "entityName", + "nestedFilters": [], + "criteria": [ + { + "value": "Paste Operation", + "evaluator": "IN" + }, + { + "value": "Create Operation", + "evaluator": "IN" + }, + { + "value": "Checkin Operation", + "evaluator": "IN" + }, + { + "value": "Create Document Operation", + "evaluator": "IN" + }, + { + "value": "Edit Operation", + "evaluator": "IN" + }, + { + "value": "Copy Operation", + "evaluator": "IN" + }, + { + "value": "Folder Navigation", + "evaluator": "IN" + }, + { + "value": "Rename Operation", + "evaluator": "IN" + }, + { + "value": "Move Operation", + "evaluator": "IN" + }, + { + "value": "Set Preference Operation", + "evaluator": "IN" + }, + { + "value": "Delete Operation", + "evaluator": "IN" + }, + { + "value": "WC_LoginBean", + "evaluator": "IN" + }, + { + "value": "Checkout Operation", + "evaluator": "IN" + } + ] + } + ], + "criteria": [] + }, + "enabled": true + } + ], + "visualConfig": { + "type": "TOP_LIST", + "global": { + "theme": "DEFAULT", + "seriesType": "LINE" + }, + "rules": [], + "axes": { + "xAxis": { + "visible": true + }, + "yAxes": [] + }, + "heatmapSettings": {}, + "thresholds": [], + "tableSettings": {}, + "graphChartSettings": { + "connectNulls": false + } + } + }, + { + "name": "", + "tileType": "DATA_EXPLORER", + "configured": true, + "bounds": { + "top": 950, + "left": 532, + "width": 570, + "height": 380 + }, + "tileFilter": {}, + "customName": "Data explorer results", + "queries": [ + { + "id": "A", + "metric": "builtin:service.errors.total.count", + "spaceAggregation": "AVG", + "timeAggregation": "DEFAULT", + "splitBy": [ + "dt.entity.service" + ], + "filterBy": { + "filterOperator": "AND", + "nestedFilters": [ + { + "filter": "dt.entity.service", + "filterType": "NAME", + "filterOperator": "OR", + "entityAttribute": "entityName", + "nestedFilters": [], + "criteria": [ + { + "value": "Copy Operation", + "evaluator": "IN" + }, + { + "value": "Create Document Operation", + "evaluator": "IN" + }, + { + "value": "Rename Operation", + "evaluator": "IN" + }, + { + "value": "Checkin Operation", + "evaluator": "IN" + }, + { + "value": "Create Operation", + "evaluator": "IN" + }, + { + "value": "Edit Operation", + "evaluator": "IN" + }, + { + "value": "Delete Operation", + "evaluator": "IN" + }, + { + "value": "Folder Navigation", + "evaluator": "IN" + }, + { + "value": "Move Operation", + "evaluator": "IN" + }, + { + "value": "WC_LoginBean", + "evaluator": "IN" + }, + { + "value": "Paste Operation", + "evaluator": "IN" + }, + { + "value": "Set Preference Operation", + "evaluator": "IN" + }, + { + "value": "Checkout Operation", + "evaluator": "IN" + } + ] + } + ], + "criteria": [] + }, + "enabled": true + } + ], + "visualConfig": { + "type": "GRAPH_CHART", + "global": { + "theme": "DEFAULT", + "seriesType": "LINE" + }, + "rules": [ + { + "matcher": "A:", + "properties": { + "seriesType": "COLUMN" + } + } + ], + "axes": { + "xAxis": { + "visible": true + }, + "yAxes": [] + }, + "heatmapSettings": {}, + "thresholds": [], + "tableSettings": {}, + "graphChartSettings": { + "connectNulls": false + } + } + }, + { + "name": "User Sessions Query", + "tileType": "DTAQL", + "configured": true, + "bounds": { + "top": 342, + "left": 1178, + "width": 608, + "height": 608 + }, + "tileFilter": {}, + "customName": "Action performance by user", + "query": "SELECT usersession.userId AS \"User\", name AS \"Action\", COUNT(*) AS \"Count\", MAX(requestErrorCount) AS \"Errors\", AVG(duration) AS \"Response time\" \nFROM useraction \nWHERE usersession.userId IS NOT NULL AND application = \"PTC Windchill\"\nGROUP BY usersession.userId, name \nORDER BY MAX(requestErrorCount), AVG(duration) DESC", + "type": "TABLE", + "limit": 50 + }, + { + "name": "Operations - Request count", + "tileType": "HEADER", + "configured": true, + "bounds": { + "top": 0, + "left": 228, + "width": 342, + "height": 38 + }, + "tileFilter": {} + }, + { + "name": "Operations - Response time", + "tileType": "HEADER", + "configured": true, + "bounds": { + "top": 456, + "left": 228, + "width": 342, + "height": 38 + }, + "tileFilter": {} + }, + { + "name": "Operations - Failure rate", + "tileType": "HEADER", + "configured": true, + "bounds": { + "top": 912, + "left": 228, + "width": 342, + "height": 38 + }, + "tileFilter": {} + }, + { + "name": "User Analysis", + "tileType": "HEADER", + "configured": true, + "bounds": { + "top": 0, + "left": 1178, + "width": 190, + "height": 38 + }, + "tileFilter": {} + }, + { + "name": "Active Users", + "tileType": "DATA_EXPLORER", + "configured": true, + "bounds": { + "top": 38, + "left": 1482, + "width": 304, + "height": 304 + }, + "tileFilter": {}, + "customName": "Data explorer results", + "queries": [ + { + "id": "A", + "metric": "ext:custom.jmx.ActiveUsers.metric_ActiveUserCount_1607449605485", + "spaceAggregation": "AVG", + "timeAggregation": "DEFAULT", + "splitBy": [], + "filterBy": { + "nestedFilters": [], + "criteria": [] + }, + "enabled": true + } + ], + "visualConfig": { + "type": "GRAPH_CHART", + "global": { + "theme": "DEFAULT", + "seriesType": "LINE", + "hideLegend": true + }, + "rules": [], + "axes": { + "xAxis": { + "displayName": "", + "visible": true + }, + "yAxes": [ + { + "displayName": "", + "visible": true, + "min": "AUTO", + "max": "AUTO", + "position": "LEFT", + "queryIds": [ + "A" + ], + "defaultAxis": true + } + ] + }, + "heatmapSettings": {}, + "thresholds": [ + { + "axisTarget": "LEFT", + "rules": [ + { + "color": "#7dc540" + }, + { + "color": "#f5d30f" + }, + { + "color": "#dc172a" + } + ], + "queryId": "", + "visible": true + } + ], + "tableSettings": {}, + "graphChartSettings": { + "connectNulls": false + } + } + }, + { + "name": "User Sessions Query", + "tileType": "DTAQL", + "configured": true, + "bounds": { + "top": 38, + "left": 1178, + "width": 304, + "height": 304 + }, + "tileFilter": {}, + "customName": "Logins by user", + "query": "SELECT distinct(userId) AS User, count(*) AS Count FROM usersession WHERE userId IS NOT NULL GROUP BY userId", + "type": "TABLE", + "limit": 50 + }, + { + "name": "Application health", + "tileType": "APPLICATIONS", + "configured": true, + "bounds": { + "top": 190, + "left": 0, + "width": 152, + "height": 152 + }, + "tileFilter": {}, + "chartVisible": true + }, + { + "name": "Host health", + "tileType": "HOSTS", + "configured": true, + "bounds": { + "top": 646, + "left": 0, + "width": 152, + "height": 152 + }, + "tileFilter": {}, + "chartVisible": true + }, + { + "name": "Service health", + "tileType": "SERVICES", + "configured": true, + "bounds": { + "top": 342, + "left": 0, + "width": 152, + "height": 152 + }, + "tileFilter": {}, + "chartVisible": true + }, + { + "name": "Database health", + "tileType": "DATABASES_OVERVIEW", + "configured": true, + "bounds": { + "top": 494, + "left": 0, + "width": 152, + "height": 152 + }, + "tileFilter": {}, + "chartVisible": true + }, + { + "name": "Problems", + "tileType": "OPEN_PROBLEMS", + "configured": true, + "bounds": { + "top": 38, + "left": 0, + "width": 152, + "height": 152 + }, + "tileFilter": {} + } + ] +} \ No newline at end of file diff --git a/assets/11-Dashboards/PTCWindchillUserData.json b/assets/11-Dashboards/PTCWindchillUserData.json deleted file mode 100644 index e36c3d9..0000000 --- a/assets/11-Dashboards/PTCWindchillUserData.json +++ /dev/null @@ -1,224 +0,0 @@ -{ - "metadata": { - "configurationVersions": [ - 5 - ], - "clusterVersion": "1.224.76.20210824-135737" - }, - "dashboardMetadata": { - "name": "PTC Windchill - User Data", - "shared": true, - "owner": "Dynatrace", - "dashboardFilter": null, - "tags": [ - "PTC" - ], - "preset": true - }, - "tiles": [ - { - "name": "User Sessions Query", - "tileType": "DTAQL", - "configured": true, - "bounds": { - "top": 0, - "left": 0, - "width": 874, - "height": 304 - }, - "tileFilter": { - "timeframe": null, - "managementZone": null - }, - "customName": "User sessions query results", - "query": "SELECT distinct(userId), count(*) FROM usersession GROUP BY userId", - "type": "COLUMN_CHART", - "visualizationConfig": { - "hasAxisBucketing": false - }, - "limit": 50 - }, - { - "name": "User behavior", - "tileType": "SESSION_METRICS", - "configured": true, - "bounds": { - "top": 0, - "left": 874, - "width": 304, - "height": 304 - }, - "tileFilter": { - "timeframe": null, - "managementZone": null - }, - "assignedEntities": [ - "APPLICATION-681D2E7F8A1E0E96" - ] - }, - { - "name": "Key user action overview", - "tileType": "UEM_KEY_USER_ACTIONS", - "configured": true, - "bounds": { - "top": 304, - "left": 874, - "width": 304, - "height": 304 - }, - "tileFilter": { - "timeframe": null, - "managementZone": null - }, - "assignedEntities": [ - "APPLICATION-681D2E7F8A1E0E96" - ] - }, - { - "name": "TotalActiveUserCount", - "tileType": "DATA_EXPLORER", - "configured": true, - "bounds": { - "top": 304, - "left": 0, - "width": 304, - "height": 304 - }, - "tileFilter": { - "timeframe": null, - "managementZone": null - }, - "customName": "TotalActiveUserCount", - "queries": [ - { - "id": "A", - "metric": "ext:custom.jmx.ActiveUsers.metric_TotalActiveUserCount_1607449783133", - "spaceAggregation": "AVG", - "timeAggregation": "DEFAULT", - "splitBy": [], - "sortBy": null, - "filterBy": { - "filter": null, - "globalEntity": null, - "filterType": null, - "filterOperator": "AND", - "entityAttribute": null, - "nestedFilters": [], - "criteria": [] - }, - "limit": null, - "metricSelector": null, - "foldTransformation": null, - "enabled": true - } - ], - "visualConfig": { - "type": "SINGLE_VALUE", - "global": { - "theme": "BLUE", - "threshold": { - "axisTarget": "LEFT", - "columnId": null, - "rules": [ - { - "value": null, - "color": "#7dc540" - }, - { - "value": null, - "color": "#f5d30f" - }, - { - "value": null, - "color": "#dc172a" - } - ] - }, - "seriesType": "LINE", - "hasTrendline": true - }, - "rules": [], - "axes": { - "xAxis": { - "displayName": null, - "visible": true - }, - "yAxes": [] - } - } - }, - { - "name": "ActiveUserCount", - "tileType": "DATA_EXPLORER", - "configured": true, - "bounds": { - "top": 304, - "left": 304, - "width": 570, - "height": 304 - }, - "tileFilter": { - "timeframe": null, - "managementZone": null - }, - "customName": "ActiveUserCount", - "queries": [ - { - "id": "A", - "metric": "ext:custom.jmx.ActiveUsers.metric_ActiveUserCount_1607449605485", - "spaceAggregation": "AVG", - "timeAggregation": "DEFAULT", - "splitBy": [], - "sortBy": null, - "filterBy": { - "filter": null, - "globalEntity": null, - "filterType": null, - "filterOperator": "AND", - "entityAttribute": null, - "nestedFilters": [], - "criteria": [] - }, - "limit": null, - "metricSelector": null, - "foldTransformation": null, - "enabled": true - } - ], - "visualConfig": { - "type": "GRAPH_CHART", - "global": { - "theme": "GREEN", - "threshold": { - "axisTarget": "LEFT", - "columnId": null, - "rules": [ - { - "value": null, - "color": "#7dc540" - }, - { - "value": null, - "color": "#f5d30f" - }, - { - "value": null, - "color": "#dc172a" - } - ] - }, - "seriesType": "LINE", - "hasTrendline": null - }, - "rules": [], - "axes": { - "xAxis": { - "displayName": null, - "visible": true - }, - "yAxes": [] - } - } - } - ] -} \ No newline at end of file From 26bbde9df71053abd4d93add9bbc528d8a1080c4 Mon Sep 17 00:00:00 2001 From: Kodai Ishikawa Date: Fri, 19 Nov 2021 10:31:33 -0500 Subject: [PATCH 8/9] Updated PTCWindchillOperations.json Minor fix to metric name --- assets/11-Dashboards/PTCWindchillOperations.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/11-Dashboards/PTCWindchillOperations.json b/assets/11-Dashboards/PTCWindchillOperations.json index f7dc819..2d2e8da 100644 --- a/assets/11-Dashboards/PTCWindchillOperations.json +++ b/assets/11-Dashboards/PTCWindchillOperations.json @@ -780,7 +780,7 @@ "queries": [ { "id": "A", - "metric": "ext:custom.jmx.ActiveUsers.metric_ActiveUserCount_1607449605485", + "metric": "ext:custom.jmx.ActiveUsers.metric_ActiveUserCount-1", "spaceAggregation": "AVG", "timeAggregation": "DEFAULT", "splitBy": [], From d2efa7b98b234bcfdd1203172f98e61406b9d863 Mon Sep 17 00:00:00 2001 From: Kodai Ishikawa Date: Fri, 19 Nov 2021 10:38:47 -0500 Subject: [PATCH 9/9] Updated extensions Added PTC prefix to UI extension names and metrics --- .../08-Extensions/custom.jmx.ActiveUsers.zip | Bin 1035 -> 601 bytes assets/08-Extensions/custom.jmx.Caches.zip | Bin 1117 -> 684 bytes assets/08-Extensions/custom.jmx.Queues.zip | Bin 1131 -> 737 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/08-Extensions/custom.jmx.ActiveUsers.zip b/assets/08-Extensions/custom.jmx.ActiveUsers.zip index d51b5fc0ccf0f0d855385f9cd2ddcdd64b404b41..7014708b7260605cbb52f678fc65575b720a5c91 100644 GIT binary patch literal 601 zcmWIWW@Zs#U|`^2Pz)&!uIfrk+snwn(9h1mzzq~F$SF|Gs~=_-;=0(k)*UDk5(9%=1aRx99U! zPoYf=OLyv=sB}8FEB(olqg=C^xeXQvKD)d9&*t07C&UddPvheWTbjNuU*1W9J!B5= z6qBdxHU}siKNYz6W9E~H%;(zz-ug?)o!=0?D&Y3l#qsK=cicZ6c68e&m4*D#nNM=IGF{ub&xCcGr1WEf z_nG&v8oYlno6r1=`J}l~AFmhAO64-@I{kcMcTR6dQ_J^Tdh1!QpZ$ON(|SA0CWYY6 z5SdWX`5%8=`myEr%gd2#UrpQZtiQ0^tw$!T_SOr=^}ap_FK!In|5k6C?0(s9 zXLkvIwbZZlsxxQ2cu9lpwd@k3<#)KxywR9`;!o9LtDcN(`}@=`b~V7~O|bGOwGHy@03_Gq0Tzt`mHIf;-v4o|h5Qx~urYRwQ7dC0^P zwEMqP>pww>+xqYRr|rAh0md{4D1b?nSm%NYGBQXotjlNK6Lt4GW70ELF#SSO;9eMzAK=Z(2GYq0gt0*S K8887cFaQ8*stGj! literal 1035 zcmWIWW@Zs#-~hsivX~$SD44;{z`)I*z)+A=nx2`bmsOmf7aGFLz%Kd4Ist}DE4UdL zS+a#J6j>&Ha&veZe9-T)fxzDH+Dh{SuX3?8MTZ6)U8fQ19j>h?BAI@o>UyVgbxcRV zKiS)!-O^l)E7_Oqy*cmsO!NGEHs2R@tZ~THD=re7m{?z7V_|7!WosuhiCO$iCY#=& z9=Dla|EKx?6?ER$v~=73ES_nt$N%j36>Fc;(6za9(y|x7xGjrxWV6in%f;)6eN3s_ zJLl;1%SX>GyA^l3dc<5IM3Vr)|l^fJ?ksIw&gq9 zZk7d3CyobBDtOMVRp<0_#zG^31_{wK99;!`Oe=fs0~VGuJ-ZT~b3FQ<^xs(%bWfX{ z+5e*de8m6DYAvvd6URki&zBLf2{B?MqiBRoJ^F<=^r zkN0(S_79HG*NexMTr`2n1}(WHCx|AeCnP0&@bwA%z#rBT(7-f7f>~Wan(?Eq0^29a zN{J4pK1D@G0kMeVj0)czgAcKYiYFvY@H%(?s<)2D3D2viJ$3Xnb^UxjJ#{=o`8e8E z?PWM(#>2CSqqKEtr)y`W>deZOJiqOt)f+_irf+}7cCqyr8=F|$wKO)jw3C{d%dVZ1 zbp5$=WynAhBJ>6iKK)jyNATkC8Ozdrl$)2i+B*FNX&Pcqssdh)C4qnyf&&Q`sk zsCBPrnf1Vc^ZnIxf3A9-l@Y(&e>REHL z>n1j9J-_s%U|v&0Eu)gthUtrxU2L3B?YJ2#d+`@v&D-4XlKH!wUvEC<<)e3Ck<`9< z)8tZYG&V?Ve*Vo(uGss^IUytM4QTWQvG z<)w0|>#qw`1#CQMyCUlO-`#nKOX3z*9WT3fRX)I*k;$F`SJF`dCLRz_0Fx*Qi3=*o t$RNRRB#o1&L^IH7_*ditZFSkt$?* zVgGccuM0wUdUnfn{Yok<-*IQA?59jA*C%pQo&`-P7mPe3o)UJH89q0e>deR;j`*N;DLv5bj(?=Qal@ztX3 zQPm=oA5BxgE-v;x<+_@LyQw>}S9oYSuPB_J`Z`H{f2_wyeb+&>ujrEAVDqkM5kMfN40ixd_{Wc$CLthh)` z&*{;+r3_))?#I7gU-V7p=T?W%HA@74>|v4pCff3%Ywt7}$Ljs!skhdgIw|Ob$)g*`@=GG!A}jJeWH#9#a?~y_`$73BR8*Pq2MO2&0nKS zuGd8hDu*fbop62RH~&U_^}65le@1-%Qo<|ltHoowJ7*bBM$neWyA3PqxJ-PX9yaQ$ zOm&%6*Rp65^VCL$BN?ZByaew#cU^gwpSjANk^R*>F;jL zuPpv^ZU2FV&e#9A%YF6z9`oz;%dNq;f9!~MmtgICyVB&<&5tktD4&}fwpp*9DZrbZ zBmB$J5kd*Mj z*C*@)e^^IA1JeWvW_1B+Lj!|b44De^4f`849!LlYu_QK@?qPhSW}!f#2`g^dJG?n~;6Q)C^w~4!FdN=y^~f+ZSfOxo z=`YSCa0L=5ccKLny1~enf`T3fmNaGoql&zU2=HcQ1DV4FgnNN>7c+^f)v*0P{zwYQn7-;Js%i*?+yJEqw*vj*IY*m=P5 zuE5p1yMo?ozA3-EDOAC7i|UV56SMk*PJ!uBZ#jQWWZU%i*d!OHLl=5=l3(j~i|NgJ zc(BNJ`Kq7)p6*+9kMYekrbsWtmB$w|e17Baawc;ar$xBA_)kjm2w-z|B!&{3(`ce;x0!?YHw=NUCwsjD-0f1Gw) zP~1YTFz?!nQ~D8B2mOkg%B8rudSThew#b>woSM29&)jkL-ooR5 z`C|Ufn`-*MVcUaCD{BHDyGn80-z1Q^?YdNd>f?e6GBQXoOyODeI`r;!#-#2wV0z0t`Sl?{etNa% literal 1131 zcmWIWW@Zs#-~hrWc|Ji5P*B3dz`)I*z)+A=nx2`bmsOmf7aGFLz|MPKEdhp0E4UdL zS+a#J6j>&Ha&veadO!b`fk0i`ex*~7k4&hzE1kqqDm;bpu9mN8(d6uBx_!#O?+Atd zyq|8(X(6b%!EdgbssG2n``+8lpZ|N_bNi+VQ`G;lpO@!#|99Yo(4hkyOsW$%KlI-w zT^G2(K`iS`(CU9C`*m4(0xl$|?eOy7;n*Z%oV+0>)_>XSuVveI?TgG?FZTLuh2c!G zFh+m5jFRG|Z|8lD^mfv^JR_xh(+Z;{*PdQ;yx5%ip_yaKuRnL^?G4H+4Gg_E=gl(C zuAE)X3C@yh9G~+n4QKh*mDV-OJ3O|WM?EGsnzN}X+G#IO_GfM#9@k~L-WR?rtFI|l z4pdQ4isUow!S8h1oYh15r8wDs>&YhQ z@0Z-?r6D!n>1EcrJ-nv;Y@Lzqz8`8g-d=Xa<^9($C*Lh9TlQm;wxGk_trLu$bU!r4 z^=Y!@CEfiV^g)EhOmXF=%>CtC3xE1sq{Nt?Ke{aD#JO#yYnSYrKGP*Zto6`Q$&|cV zpG-qU&Th&5Ht*lJ^9^V1HBzp=vlp2Ysudnmnd$p(i)X<3uW=7|epV!AMx1oukpyI6$iU+obj!F9CzmU_PXBlYzw$&-rlwLTglvl zsSh}}ZOc7p-nCE3^>*8b`=2(wo@+6Co~-^2Y47-nOJz6zP*0JqpKE&Jmigzi^~?d@ z>>O9#)c{soLpa+8Oro=03f7sw;Oc zJi5|VvGe6o9-jEQ`A3^gHoAmlHN05TH0R7CA?9XQnE-J^C*RZ*2i7@2ud;Led}Apy z9hd__9t`kiWD;RUSkee$;qpHyucG-M-C$%(L7@r*OB&|_V}ZOd4)A7W Q1DV4FgnNPX3}z4y03FV