openshift/runtime/previously onborded applications all compiling and with templates - READMEs linking the confluence for custom services & synthetics

custom-service-JONYR
qxz15oi 2021-04-26 11:47:36 +02:00
parent a51b7fc6ad
commit 8d850d1ce1
2459 changed files with 69170 additions and 17603 deletions

View File

@ -0,0 +1,60 @@
config:
- CDAPIGW-PROD: default.json
- CDAPIGW-INT: default.json
#Prod alerting profiles for EMEA/NA/CN
#Dry-run needed for all hubs
CDAPIGW-PROD:
- name: CD_APIGW PROD
- tag: APIGW
- mzId: CD_APIGW/management-zone/CDAPIGW.id
- env: PROD
- skipDeployment: "true"
#Configuration
CDAPIGW-PROD.EMEA-Prod:
- name: CD_APIGW PROD
- tag: APIGW
- mzId: CD_APIGW/management-zone/CDAPIGW.id
- env: PROD
- skipDeployment: "false"
CDAPIGW-PROD.NA-Prod:
- name: CD_APIGW PROD
- tag: APIGW
- mzId: CD_APIGW/management-zone/CDAPIGW.id
- env: PROD
- skipDeployment: "false"
CDAPIGW-PROD.CN-Prod:
- name: CD_APIGW PROD
- tag: APIGW
- mzId: CD_APIGW/management-zone/CDAPIGW.id
- env: PROD
- skipDeployment: "false"
#INT alerting profiles for EMEA/NA/CN
#Dry-run needed for all hubs
CDAPIGW-INT:
- name: CD_APIGW INT
- tag: APIGW
- mzId: CD_APIGW/management-zone/CDAPIGW.id
- env: INT
- skipDeployment: "true"
#Configuration
CDAPIGW-INT.EMEA-PreProd:
- name: CD_APIGW INT
- tag: APIGW
- mzId: CD_APIGW/management-zone/CDAPIGW.id
- env: INT
- skipDeployment: "false"
CDAPIGW-INT.NA-PreProd:
- name: CD_APIGW INT
- tag: APIGW
- mzId: CD_APIGW/management-zone/CDAPIGW.id
- env: INT
- skipDeployment: "false"
CDAPIGW-INT.CN-PreProd:
- name: CD_APIGW INT
- tag: APIGW
- mzId: CD_APIGW/management-zone/CDAPIGW.id
- env: INT
- skipDeployment: "false"

View File

@ -98,25 +98,6 @@
} }
] ]
} }
},
{
"delayInMinutes": 0,
"severityLevel": "MONITORING_UNAVAILABLE",
"tagFilter": {
"includeMode": "INCLUDE_ALL",
"tagFilters": [
{
"context": "CONTEXTLESS",
"key": "Component",
"value": "{{.tag}}"
},
{
"context": "CONTEXTLESS",
"key": "Environment",
"value": "{{.env}}"
}
]
}
} }
] ]
} }

View File

@ -0,0 +1,10 @@
## Custom metrics - Multidimensional Analysis
Under the Multidimensional Analysis you're able to save a view but not to create a metric. Instead, you can do it in here:
1. Create the metric within the Dynatrace UI using the Mutidimensional Analysis view.
2. Save the view and create a ticket for the OPAPM team [here](link). Please provide the following information:
- View created in the Dynatrace UI
- Your Dynatrace configuration folder (i.e. CD_<app_name>)
The OPAPM team will proceed creating the metric and updating your configuration in monaco.

View File

@ -0,0 +1,67 @@
### Process Group Detection Rules and Naming
#### Detection Rule or Naming?
For the explanation, we're using a real example of the Infotainment application:
!(PGNaming1)[../../../../img/PGNaming1.PNG]
Before working with your dashboards and alerting profiles, an important task to do when working with Dynatrace is checking
the structure of your applications (process groups). You can do that clicking under *technologies* and filter using your
application Management Zone.
In the picture above, there are two Process Groups called bon-information-prod. **If you see duplicated process groups like in**
**this case, you MUST follow this guideline**
Next step would be to open both process groups and compare the metadata. In that way, you can identify if all process instances are
part of the same application or not. An easy way to do that is asking yourself: how many instances of my application do i have?
If you have 4 instances in total and you're able to see 2 in one PG and other 2 in other PG it means that **they are part of the **
**same application**
Another situation could be that checking on the metadata, then you see that are **two different application** and Dynatrace is just naming
the process group in the same way
*Same application*
- Problem: Dynatrace is creating two different process groups, what transalates in two separated services for the same application. Instead of
seeing all the traffic in one service, you will have it splitted and it will complicate your monitoring
- Solution: create a process group detection rule. Contact Dynatrace Expert
*Different application*
- Problem: Dynatrace is just naming in the same way applications that are different.
- Solution: This case is less severe, since it can be fixed with a process group naming rule.
What about our example?
!(PGNaming2)[../../../../img/PGNaming2.PNG]
!(PGNaming3)[../../../../img/PGNaming3.PNG]
Based on the feedback of the infotaiment team, each process group is a different application (microservice) and it's visible in the kubernetes container/workload
within the metadata of each Process Group.
#### How to create a Process Group Detection Rule
1. Open the *conditional-naming-processgroup.yaml* file and create a rule that looks like this:
```
config:
- CDInfotainmentRule1: template.json
CDInfotainmentRule1:
- name: Infotainment Rule 1
- nameFormat: {ProcessGroup:KubernetesNamespace} - {ProcessGroup:KubernetesContainerName}
- tag: Infotainment
- skipDeployment: false
```
The result of the rule will be renaming the PG to this:
```
bon-information-prod ipa
bon-information-prod rsl
```
Other possible placeholders that you can use are for example:
{ProcessGroup:KubernetesNamespace} - {ProcessGroup:KubernetesContainerName/[^\\-]*$}
{ProcessGroup:KubernetesNamespace} - {ProcessGroup:KubernetesFullPodName/buffet-(.*?)-}
{ProcessGroup:DetectedName} - {HostGroup:Name/[^\\_]*$}
{ProcessGroup:KubernetesNamespace}
{ProcessGroup:CommandLineArgs/.*?\\-f\\s\\/www\\/(.*?)\\/generated\\/httpd\\.conf.*?}
You can combine different ones. Check the (documentation)[link] for more

View File

@ -0,0 +1,8 @@
config:
- CDAPIGW: template.json
CDAPIGW:
- name: MyProcessNamingRule
- nameFormat: "{ProcessGroup:KubernetesNamespace/regex-example}"
- tag: APIGW
- skipDeployment: "true"

View File

@ -0,0 +1,29 @@
{
"displayName": "{{.name}}",
"enabled": true,
"metadata": {
"clusterVersion": "1.214.107.20210407-223952",
"configurationVersions": [
0
]
},
"nameFormat": "{{.nameFormat}}",
"rules": [
{
"comparisonInfo": {
"negate": false,
"operator": "EQUALS",
"type": "TAG",
"value": {
"context": "CONTEXTLESS",
"key": "Component",
"value": "{{.tag}}"
}
},
"key": {
"attribute": "PROCESS_GROUP_TAGS"
}
}
],
"type": "PROCESS_GROUP"
}

View File

@ -0,0 +1,35 @@
### Service Naming Rules
A typical case could be that you access to *Transaction & Services* and you find two services that are exactly the same:
*DataDownloadV1*
*DataDownloadV1*
If you drilldown into the service and you check in the process group, you may have a PROD and a E2E for each service.
*Note: if you see that both process group are exactly the same, please contact a Dynatrace expert to create a Process*
*Group detection rule*
In the case the PG are PROD and E2E, then we need to create a rule that looks like this:
```
config:
- CDInfotainmentRule1: template.json
CDInfotainmentRule1:
- name: Infotainment Rule 1
- nameFormat: {Service:DetectedName} - {ProcessGroup:KubernetesNamespace/[^-]+$}
- tag: Infotainment
- skipDeployment: false
```
The rule will get the Service Detected Name (current name) and it will extract (with a regex) the part of the kubernetes namespace after the "-", so -prod or -e2e, resulting in:
*DataDownloadV1 - prod*
*DataDownloadV1 - e2e*
Now, services will be easy to identify.
You can create rules based on any property/metadata. Some other placeholder's eamples:
{Service:DatabaseName} - E2E
{Service:WebServiceName} - {ProcessGroup:Kubernetes:microservice} - {ProcessGroup:Kubernetes:environment}
{Service:DetectedName} - {ProcessGroup:KubernetesContainerName} - {ProcessGroup:KubernetesNamespace/[^-]+$}
{Service:DetectedName} - {ProcessGroup:SpringBootProfileName/[^\\-]*$}

View File

@ -0,0 +1,8 @@
config:
- CDAPIGW: template.json
CDAPIGW:
- name: MyProcessNamingRule
- nameFormat: "{ProcessGroup:KubernetesNamespace/regex-example}"
- tag: APIGW
- skipDeployment: "true"

View File

@ -0,0 +1,29 @@
{
"displayName": "{{.name}}",
"enabled": true,
"metadata": {
"clusterVersion": "1.214.107.20210407-223952",
"configurationVersions": [
0
]
},
"nameFormat": "{{.nameFormat}}",
"rules": [
{
"comparisonInfo": {
"negate": false,
"operator": "EQUALS",
"type": "TAG",
"value": {
"context": "CONTEXTLESS",
"key": "Component",
"value": "{{.tag}}"
}
},
"key": {
"attribute": "SERVICE_TAGS"
}
}
],
"type": "SERVICE"
}

View File

@ -0,0 +1,4 @@
### How to configure custom services?
Please refer to [this](https://atc.bmwgroup.net/confluence/display/OPMAAS/Documentation+%7C+Custom+Services) page to configure your custom services.

View File

@ -0,0 +1,9 @@
config:
- customService1: template-1-1.json
customService1:
- name: myJOYNRService
- className: com.bmw.cc.conn.this.is.just.an.exampleClasss
- methodName: exampleJoynrMethod
- returnType: void
- skipDeployment: "true"

View File

@ -0,0 +1,23 @@
{
"enabled": true,
"name": "{{.name}}",
"processGroups": [],
"queueEntryPoint": false,
"queueEntryPointType": null,
"rules": [
{
"annotations": [],
"className": "{{.className}}",
"enabled": true,
"fileName": "",
"matcher": "EQUALS",
"methodRules": [
{
"argumentTypes": [],
"methodName": "{{.methodName}}",
"returnType": "{{.returnType}}"
}
]
}
]
}

View File

@ -0,0 +1,13 @@
## Update dashboard configuration
- Configuration changes (like in dashboards, alerting profiles) must be done via a pull request. Changing a dashboard just in the environment, will cause that it will be overwritten by Monaco.
- How to generate changes in your dashboards?
1. Modify the dashboard within the Dynatrace UI with the intended changes.
2. Copy the JSON of the dashboards. (Can be found under the dashboard settings)
3. Paste the copied JSON under the Monaco JSON, overwrite it.
4. Commit and pull request to merge the branch to the master:
```
git add <changes>
git commit -m "<app_name> configuration changes"
git push -u origin <branch>
```

View File

@ -0,0 +1,127 @@
config:
- CDAPIGW-PROD: default.json
- CDAPIGW-E2E: default.json
- CDAPIGW-INT: default.json
- CDAPIGW-TEST: default.json
#PROD dashboards for EMEA/NA/CN Prod
#Dry-run needed for all hubs
CDAPIGW-PROD:
- name: CD_APIGW PROD
- mzName: CD_APIGW/management-zone/CDAPIGW.name
- mzId: CD_APIGW/management-zone/CDAPIGW.id
- env: PROD
- skipDeployment: "true"
#Configuration
CDAPIGW-PROD.EMEA-Prod:
- name: CD_APIGW PROD
- mzName: CD_APIGW/management-zone/CDAPIGW.name
- mzId: CD_APIGW/management-zone/CDAPIGW.id
- tag: APIGW
- env: PROD
- skipDeployment: "false"
CDAPIGW-PROD.NA-Prod:
- name: CD_APIGW PROD
- mzName: CD_APIGW/management-zone/CDAPIGW.name
- mzId: CD_APIGW/management-zone/CDAPIGW.id
- tag: APIGW
- env: PROD
- skipDeployment: "false"
CDAPIGW-PROD.CN-Prod:
- name: CD_APIGW PROD
- mzName: CD_APIGW/management-zone/CDAPIGW.name
- mzId: CD_APIGW/management-zone/CDAPIGW.id
- tag: APIGW
- env: PROD
- skipDeployment: "false"
#E2E dashboards for EMEA/NA/CN E2E
#Dry-run needed for all hubs
CDAPIGW-E2E:
- name: CD_APIGW E2E
- mzName: CD_APIGW/management-zone/CDAPIGW.name
- mzId: CD_APIGW/management-zone/CDAPIGW.id
- env: E2E
- skipDeployment: "true"
#Configuration
CDAPIGW-E2E.EMEA-Prod:
- name: CD_APIGW E2E
- mzName: CD_APIGW/management-zone/CDAPIGW.name
- mzId: CD_APIGW/management-zone/CDAPIGW.id
- env: E2E
- tag: APIGW
- skipDeployment: "true"
CDAPIGW-E2E.NA-Prod:
- name: CD_APIGW E2E
- mzName: CD_APIGW/management-zone/CDAPIGW.name
- mzId: CD_APIGW/management-zone/CDAPIGW.id
- env: E2E
- tag: APIGW
- skipDeployment: "true"
CDAPIGW-E2E.CN-Prod:
- name: CD_APIGW E2E
- mzName: CD_APIGW/management-zone/CDAPIGW.name
- mzId: CD_APIGW/management-zone/CDAPIGW.id
- env: E2E
- tag: APIGW
- skipDeployment: "true"
#INT dashboards for EMEA/NA/CN
#Dry-run needed for all hubs
CDAPIGW-INT:
- name: CD_APIGW INT
- mzName: CD_APIGW/management-zone/CDAPIGW.name
- mzId: CD_APIGW/management-zone/CDAPIGW.id
- env: INT
- tag: APIGW
- skipDeployment: "true"
#Configuration
CDAPIGW-INT.EMEA-PreProd:
- name: CD_APIGW INT
- mzName: CD_APIGW/management-zone/CDAPIGW.name
- mzId: CD_APIGW/management-zone/CDAPIGW.id
- env: INT
- tag: APIGW
- skipDeployment: "false"
CDAPIGW-INT.NA-PreProd:
- name: CD_APIGW INT
- mzName: CD_APIGW/management-zone/CDAPIGW.name
- mzId: CD_APIGW/management-zone/CDAPIGW.id
- env: INT
- skipDeployment: "false"
CDAPIGW-INT.CN-PreProd:
- name: CD_APIGW INT
- mzName: CD_APIGW/management-zone/CDAPIGW.name
- mzId: CD_APIGW/management-zone/CDAPIGW.id
- env: INT
- skipDeployment: "false"
#TEST dashboards for EMEA/NA/CN
#Dry-run needed for all hubs
CDAPIGW-TEST:
- name: CD_APIGW TEST
- mzName: CD_APIGW/management-zone/CDAPIGW.name
- mzId: CD_APIGW/management-zone/CDAPIGW.id
- tag: APIGW
- env: TEST
- skipDeployment: "true"
#Configuration
CDAPIGW-TEST.EMEA-PreProd:
- name: CD_APIGW TEST
- mzName: CD_APIGW/management-zone/CDAPIGW.name
- mzId: CD_APIGW/management-zone/CDAPIGW.id
- tag: APIGW
- env: TEST
- skipDeployment: "false"
CDAPIGW-TEST.NA-PreProd:
- name: CD_APIGW TEST
- mzName: CD_APIGW/management-zone/CDAPIGW.name
- mzId: CD_APIGW/management-zone/CDAPIGW.id
- env: TEST
- skipDeployment: "false"
CDAPIGW-TEST.CN-PreProd:
- name: CD_APIGW TEST
- mzName: CD_APIGW/management-zone/CDAPIGW.name
- mzId: CD_APIGW/management-zone/CDAPIGW.id
- env: TEST
- skipDeployment: "false"

View File

@ -0,0 +1,308 @@
{
"metadata": {
"configurationVersions": [
3
],
"clusterVersion": "1.214.107.20210407-223952"
},
"dashboardMetadata": {
"name": "{{.name}}",
"shared": true,
"owner": "Ignacio.Goldman@partner.bmwgroup.com",
"dashboardFilter": {
"timeframe": "-24h to now"
},
"tags": [
"{{.tag}}"
]
},
"tiles": [
{
"name": "Custom chart",
"tileType": "CUSTOM_CHARTING",
"configured": true,
"bounds": {
"top": 228,
"left": 38,
"width": 1064,
"height": 304
},
"tileFilter": {},
"filterConfig": {
"type": "MIXED",
"customName": "Failure rate (HTTP 4xx/5xx errors)",
"defaultName": "Custom chart",
"chartConfig": {
"legendShown": true,
"type": "TIMESERIES",
"series": [
{
"metric": "builtin:service.errors.fourxx.rate",
"aggregation": "AVG",
"type": "BAR",
"entityType": "SERVICE",
"dimensions": [],
"sortAscending": false,
"sortColumn": false,
"aggregationRate": "TOTAL"
},
{
"metric": "builtin:service.errors.fivexx.rate",
"aggregation": "AVG",
"type": "BAR",
"entityType": "SERVICE",
"dimensions": [],
"sortAscending": false,
"sortColumn": true,
"aggregationRate": "TOTAL"
}
],
"resultMetadata": {
"nullbuiltin:service.errors.fivexx.rate|AVG|TOTAL|BAR|SERVICE": {
"lastModified": 1617956393463,
"customColor": "#ff0000"
},
"nullbuiltin:service.errors.fourxx.rate|AVG|TOTAL|BAR|SERVICE": {
"lastModified": 1617956441725,
"customColor": "#fff29a"
}
}
},
"filtersPerEntityType": {
"SERVICE": {
"AUTO_TAGS": [
"Environment:{{.env}}",
"Component:{{.tag}}"
]
}
}
}
},
{
"name": "Problems",
"tileType": "OPEN_PROBLEMS",
"configured": true,
"bounds": {
"top": 38,
"left": 950,
"width": 152,
"height": 152
},
"tileFilter": {
"managementZone": {
"id": "{{.mzId}}",
"name": "{{.mzName}}"
}
}
},
{
"name": "Overall Health",
"tileType": "HEADER",
"configured": true,
"bounds": {
"top": 0,
"left": 38,
"width": 1064,
"height": 38
},
"tileFilter": {}
},
{
"name": "Markdown",
"tileType": "MARKDOWN",
"configured": true,
"bounds": {
"top": 532,
"left": 38,
"width": 1064,
"height": 38
},
"tileFilter": {},
"markdown": "---\n"
},
{
"name": "Custom chart",
"tileType": "CUSTOM_CHARTING",
"configured": true,
"bounds": {
"top": 570,
"left": 38,
"width": 1064,
"height": 304
},
"tileFilter": {},
"filterConfig": {
"type": "MIXED",
"customName": "Response time, Request Count and Number of Errors",
"defaultName": "Custom chart",
"chartConfig": {
"legendShown": true,
"type": "TIMESERIES",
"series": [
{
"metric": "builtin:service.response.time",
"aggregation": "AVG",
"type": "LINE",
"entityType": "SERVICE",
"dimensions": [],
"sortAscending": false,
"sortColumn": false,
"aggregationRate": "TOTAL"
},
{
"metric": "builtin:service.requestCount.total",
"aggregation": "NONE",
"type": "BAR",
"entityType": "SERVICE",
"dimensions": [],
"sortAscending": false,
"sortColumn": false,
"aggregationRate": "TOTAL"
},
{
"metric": "builtin:service.errors.total.count",
"aggregation": "NONE",
"type": "BAR",
"entityType": "SERVICE",
"dimensions": [],
"sortAscending": false,
"sortColumn": true,
"aggregationRate": "TOTAL"
}
],
"resultMetadata": {
"nullbuiltin:service.requestCount.total|NONE|TOTAL|BAR|SERVICE": {
"lastModified": 1595275720776,
"customColor": "#008cdb"
},
"nullbuiltin:service.errors.total.count|NONE|TOTAL|BAR|SERVICE": {
"lastModified": 1595275955999,
"customColor": "#ef651f"
},
"nullbuiltin:service.response.time|AVG|TOTAL|LINE|SERVICE": {
"lastModified": 1595275686773,
"customColor": "#b4e5f9"
}
}
},
"filtersPerEntityType": {
"SERVICE": {
"AUTO_TAGS": [
"Environment:{{.env}}",
"Component:{{.tag}}"
]
}
}
}
},
{
"name": "Markdown",
"tileType": "MARKDOWN",
"configured": true,
"bounds": {
"top": 190,
"left": 38,
"width": 1064,
"height": 38
},
"tileFilter": {},
"markdown": "---\n"
},
{
"name": "",
"tileType": "DATABASES_OVERVIEW",
"configured": true,
"bounds": {
"top": 38,
"left": 646,
"width": 190,
"height": 152
},
"tileFilter": {},
"filterConfig": {
"type": "DATABASE",
"customName": "Databases",
"defaultName": "Databases",
"chartConfig": {
"legendShown": true,
"type": "TIMESERIES",
"series": [],
"resultMetadata": {}
},
"filtersPerEntityType": {
"DATABASE": {
"AUTO_TAGS": [
"Environment:{{.env}}",
"Component:{{.tag}}"
]
}
}
},
"chartVisible": true
},
{
"name": "",
"tileType": "SERVICES",
"configured": true,
"bounds": {
"top": 38,
"left": 342,
"width": 190,
"height": 152
},
"tileFilter": {},
"filterConfig": {
"type": "SERVICE",
"customName": "Services",
"defaultName": "Services",
"chartConfig": {
"legendShown": true,
"type": "TIMESERIES",
"series": [],
"resultMetadata": {}
},
"filtersPerEntityType": {
"SERVICE": {
"AUTO_TAGS": [
"Environment:{{.env}}",
"Component:{{.tag}}"
]
}
}
},
"chartVisible": true
},
{
"name": "",
"tileType": "HOSTS",
"configured": true,
"bounds": {
"top": 38,
"left": 38,
"width": 190,
"height": 152
},
"tileFilter": {},
"filterConfig": {
"type": "HOST",
"customName": "Hosts",
"defaultName": "Hosts",
"chartConfig": {
"legendShown": true,
"type": "TIMESERIES",
"series": [],
"resultMetadata": {}
},
"filtersPerEntityType": {
"HOST": {
"AUTO_TAGS": [
"Environment:{{.env}}",
"Component:{{.tag}}"
]
}
}
},
"chartVisible": true
}
]
}

View File

@ -0,0 +1,60 @@
## Configure Notification System
### MS Teams - Default
*Let's suppose you would like to start receiving alerts from Dynatrace via MS Teams just for your *EMEA PROD*.*
1. Open *notification.yaml* under your application configuration folder. By default, all notification systems are configured via MS Teams with an
https://empty webhook (not configured).
2. Create an incoming webhook in MS Teams. [How to?](https://www.dynatrace.com/support/help/shortlink/set-up-msteams-integration#configuration-in-microsoft-teams)
3. Add the incoming webhook under the webhook parameter for the `<app_name>-PROD.EMEA-Prod`:
```
<app_name>-PROD.EMEA-Prod:
- name: CD_<app_name> PROD
- alertingProfile: CD_<app_name>/alerting-profile/CD<app_name>-PROD.id
- webhook: <Add webhook here>
- skipDeployment: "false"
```
4. Save and commit changes:
```
git add <changes>
git commit -m "<app_name> configuration changes"
git push -u origin <branch>
```
Note: If you want to enable MS Teams for any other hub/stage, follow the same steps but make sure you're under the right configuration:
`<app_name>-<stage>.<dynatrace-env>-<stage>:`
### Email
*The team prefers to be alerted via email, not MS Teams*
1. Keep the MS Teams integration disabled, with the https://empty webhook:
```
<app_name>-PROD.EMEA-Prod:
- name: CD_<app_name> PROD
- alertingProfile: CD_<app_name>/alerting-profile/CD<app_name>-PROD.id
- webhook: https://empty
- skipDeployment: "false"
```
2. Create a new configuration template under config, using the email template:
```
config:
- CD<app_name>email: email.json
```
3. Describe the configuration below, using the following template:
```
CD<app_name>email.EMEA-Prod:
- name: CD_<app_name> PROD
- alertingProfile: CD_<app_name>/alerting-profile/CD<app_name>-PROD.id
- receivers: distributionEmailexample@bmw.de`
```
4. Save and commit changes:
```
git add <changes>
git commit -m "<app_name> configuration changes"
git push -u origin <branch>
```
### ITSM
Coming soon!

View File

@ -0,0 +1,51 @@
config:
- CDAPIGW-PROD: msTeams.json
- CDAPIGW-INT: msTeams.json
#Prod notification system for EMEA/NA/CN
#Dry-run needed for all hubs
CDAPIGW-PROD:
- name: CD_APIGW PROD
- alertingProfile: CD_APIGW/alerting-profile/CDAPIGW-PROD.id
- webhook: https://empty
- skipDeployment: "true"
#Configuration
CDAPIGW-PROD.EMEA-Prod:
- name: CD_APIGW PROD
- alertingProfile: CD_APIGW/alerting-profile/CDAPIGW-PROD.id
- webhook: https://empty
- skipDeployment: "false"
CDAPIGW-PROD.NA-Prod:
- name: CD_APIGW PROD
- alertingProfile: CD_APIGW/alerting-profile/CDAPIGW-PROD.id
- webhook: https://empty
- skipDeployment: "false"
CDAPIGW-PROD.CN-Prod:
- name: CD_APIGW PROD
- alertingProfile: CD_APIGW/alerting-profile/CDAPIGW-PROD.id
- webhook: https://empty
- skipDeployment: "false"
#INT notification system for EMEA/NA/CN
#Dry-run needed for all hubs
CDAPIGW-INT:
- name: CD_APIGW INT
- alertingProfile: CD_APIGW/alerting-profile/CDAPIGW-INT.id
- webhook: https://empty
- skipDeployment: "true"
#Configuration
CDAPIGW-INT.EMEA-PreProd:
- name: CD_APIGW INT
- alertingProfile: CD_APIGW/alerting-profile/CDAPIGW-INT.id
- webhook: https://empty
- skipDeployment: "false"
CDAPIGW-INT.NA-PreProd:
- name: CD_APIGW INT
- alertingProfile: CD_APIGW/alerting-profile/CDAPIGW-INT.id
- webhook: https://empty
- skipDeployment: "false"
CDAPIGW-INT.CN-PreProd:
- name: CD_APIGW INT
- alertingProfile: CD_APIGW/alerting-profile/CDAPIGW-INT.id
- webhook: https://empty
- skipDeployment: "false"

View File

@ -0,0 +1,4 @@
### How to configure synthetics?
Please refer to [this](https://atc.bmwgroup.net/confluence/display/OPMAAS/Documentation+%7C+Synthetic+Monitors) page to configure your synthetics.

View File

@ -0,0 +1,82 @@
{
"anomalyDetection": {
"loadingTimeThresholds": {
"enabled": false,
"thresholds": [
{
"type": "TOTAL",
"valueMs": 0
}
]
},
"outageHandling": {
"globalOutage": true,
"localOutage": false,
"localOutagePolicy": {
"affectedLocations": 1,
"consecutiveRuns": 3
}
}
},
"automaticallyAssignedApps": [],
"enabled": true,
"frequencyMin": 1,
"locations": [
"{{.location}}"
],
"managementZones": [
{
"id": "{{.mzId}}",
"name": "{{.mzName}}"
}
],
"manuallyAssignedApps": [],
"name": "{{.name}}",
"requests": [
{
"entityId": "HTTP_CHECK_STEP-0BA53EC80CD7EE5A",
"name": "{{.name}}",
"sequenceNumber": 1
}
],
"script": {
"requests": [
{
"configuration": {
"acceptAnyCertificate": true,
"followRedirects": true,
"requestHeaders": [
{
"name": "accept",
"value": "application/json"
},
{
"name": "Content-Type",
"value": "application/json"
},
{
"name": "api_key",
"value": "355DE89C-7B72-4EA3-BDD8-157C79EB2C23"
}
]
},
"description": "{{.name}}",
"method": "GET",
"url": "{{.endpoint}}",
"validation": {
"rules": [
{
"passIfFound": true,
"type": "httpStatusesList",
"value": "200"
}
],
"rulesChaining": "or"
}
}
],
"version": "1.0"
},
"tags": [],
"type": "HTTP"
}

View File

@ -0,0 +1,10 @@
config:
- APIGW: default.json
APIGW:
- name: CD_APIGW - <synthetic-name>
- mzName: CD_APIGW/management-zone/CDAPIGW.name
- mzId: CD_APIGW/management-zone/CDAPIGW.id
- endpoint: <url>
- location: <location>
- skipDeployment: "true"

View File

@ -0,0 +1,60 @@
config:
- CDAPIM-PROD: default.json
- CDAPIM-INT: default.json
#Prod alerting profiles for EMEA/NA/CN
#Dry-run needed for all hubs
CDAPIM-PROD:
- name: CD_APIM PROD
- tag: APIM
- mzId: CD_APIM/management-zone/CDAPIM.id
- env: PROD
- skipDeployment: "true"
#Configuration
CDAPIM-PROD.EMEA-Prod:
- name: CD_APIM PROD
- tag: APIM
- mzId: CD_APIM/management-zone/CDAPIM.id
- env: PROD
- skipDeployment: "false"
CDAPIM-PROD.NA-Prod:
- name: CD_APIM PROD
- tag: APIM
- mzId: CD_APIM/management-zone/CDAPIM.id
- env: PROD
- skipDeployment: "false"
CDAPIM-PROD.CN-Prod:
- name: CD_APIM PROD
- tag: APIM
- mzId: CD_APIM/management-zone/CDAPIM.id
- env: PROD
- skipDeployment: "false"
#INT alerting profiles for EMEA/NA/CN
#Dry-run needed for all hubs
CDAPIM-INT:
- name: CD_APIM INT
- tag: APIM
- mzId: CD_APIM/management-zone/CDAPIM.id
- env: INT
- skipDeployment: "true"
#Configuration
CDAPIM-INT.EMEA-PreProd:
- name: CD_APIM INT
- tag: APIM
- mzId: CD_APIM/management-zone/CDAPIM.id
- env: INT
- skipDeployment: "false"
CDAPIM-INT.NA-PreProd:
- name: CD_APIM INT
- tag: APIM
- mzId: CD_APIM/management-zone/CDAPIM.id
- env: INT
- skipDeployment: "false"
CDAPIM-INT.CN-PreProd:
- name: CD_APIM INT
- tag: APIM
- mzId: CD_APIM/management-zone/CDAPIM.id
- env: INT
- skipDeployment: "false"

View File

@ -8,12 +8,17 @@
"delayInMinutes": 0, "delayInMinutes": 0,
"severityLevel": "AVAILABILITY", "severityLevel": "AVAILABILITY",
"tagFilter": { "tagFilter": {
"includeMode": "INCLUDE_ANY", "includeMode": "INCLUDE_ALL",
"tagFilters": [ "tagFilters": [
{ {
"context": "CONTEXTLESS", "context": "CONTEXTLESS",
"key": "Component", "key": "Component",
"value": "{{.tag}}" "value": "{{.tag}}"
},
{
"context": "CONTEXTLESS",
"key": "Environment",
"value": "{{.env}}"
} }
] ]
} }
@ -22,12 +27,17 @@
"delayInMinutes": 10, "delayInMinutes": 10,
"severityLevel": "ERROR", "severityLevel": "ERROR",
"tagFilter": { "tagFilter": {
"includeMode": "INCLUDE_ANY", "includeMode": "INCLUDE_ALL",
"tagFilters": [ "tagFilters": [
{ {
"context": "CONTEXTLESS", "context": "CONTEXTLESS",
"key": "Component", "key": "Component",
"value": "{{.tag}}" "value": "{{.tag}}"
},
{
"context": "CONTEXTLESS",
"key": "Environment",
"value": "{{.env}}"
} }
] ]
} }
@ -36,12 +46,17 @@
"delayInMinutes": 30, "delayInMinutes": 30,
"severityLevel": "PERFORMANCE", "severityLevel": "PERFORMANCE",
"tagFilter": { "tagFilter": {
"includeMode": "INCLUDE_ANY", "includeMode": "INCLUDE_ALL",
"tagFilters": [ "tagFilters": [
{ {
"context": "CONTEXTLESS", "context": "CONTEXTLESS",
"key": "Component", "key": "Component",
"value": "{{.tag}}" "value": "{{.tag}}"
},
{
"context": "CONTEXTLESS",
"key": "Environment",
"value": "{{.env}}"
} }
] ]
} }
@ -50,12 +65,17 @@
"delayInMinutes": 30, "delayInMinutes": 30,
"severityLevel": "RESOURCE_CONTENTION", "severityLevel": "RESOURCE_CONTENTION",
"tagFilter": { "tagFilter": {
"includeMode": "INCLUDE_ANY", "includeMode": "INCLUDE_ALL",
"tagFilters": [ "tagFilters": [
{ {
"context": "CONTEXTLESS", "context": "CONTEXTLESS",
"key": "Component", "key": "Component",
"value": "{{.tag}}" "value": "{{.tag}}"
},
{
"context": "CONTEXTLESS",
"key": "Environment",
"value": "{{.env}}"
} }
] ]
} }
@ -64,26 +84,17 @@
"delayInMinutes": 10, "delayInMinutes": 10,
"severityLevel": "CUSTOM_ALERT", "severityLevel": "CUSTOM_ALERT",
"tagFilter": { "tagFilter": {
"includeMode": "INCLUDE_ANY", "includeMode": "INCLUDE_ALL",
"tagFilters": [ "tagFilters": [
{ {
"context": "CONTEXTLESS", "context": "CONTEXTLESS",
"key": "Component", "key": "Component",
"value": "{{.tag}}" "value": "{{.tag}}"
} },
] {
}
},
{
"delayInMinutes": 0,
"severityLevel": "MONITORING_UNAVAILABLE",
"tagFilter": {
"includeMode": "INCLUDE_ANY",
"tagFilters": [
{
"context": "CONTEXTLESS", "context": "CONTEXTLESS",
"key": "Component", "key": "Environment",
"value": "{{.tag}}" "value": "{{.env}}"
} }
] ]
} }

View File

@ -0,0 +1,10 @@
## Custom metrics - Multidimensional Analysis
Under the Multidimensional Analysis you're able to save a view but not to create a metric. Instead, you can do it in here:
1. Create the metric within the Dynatrace UI using the Mutidimensional Analysis view.
2. Save the view and create a ticket for the OPAPM team [here](link). Please provide the following information:
- View created in the Dynatrace UI
- Your Dynatrace configuration folder (i.e. CD_<app_name>)
The OPAPM team will proceed creating the metric and updating your configuration in monaco.

View File

@ -0,0 +1,67 @@
### Process Group Detection Rules and Naming
#### Detection Rule or Naming?
For the explanation, we're using a real example of the Infotainment application:
!(PGNaming1)[../../../../img/PGNaming1.PNG]
Before working with your dashboards and alerting profiles, an important task to do when working with Dynatrace is checking
the structure of your applications (process groups). You can do that clicking under *technologies* and filter using your
application Management Zone.
In the picture above, there are two Process Groups called bon-information-prod. **If you see duplicated process groups like in**
**this case, you MUST follow this guideline**
Next step would be to open both process groups and compare the metadata. In that way, you can identify if all process instances are
part of the same application or not. An easy way to do that is asking yourself: how many instances of my application do i have?
If you have 4 instances in total and you're able to see 2 in one PG and other 2 in other PG it means that **they are part of the **
**same application**
Another situation could be that checking on the metadata, then you see that are **two different application** and Dynatrace is just naming
the process group in the same way
*Same application*
- Problem: Dynatrace is creating two different process groups, what transalates in two separated services for the same application. Instead of
seeing all the traffic in one service, you will have it splitted and it will complicate your monitoring
- Solution: create a process group detection rule. Contact Dynatrace Expert
*Different application*
- Problem: Dynatrace is just naming in the same way applications that are different.
- Solution: This case is less severe, since it can be fixed with a process group naming rule.
What about our example?
!(PGNaming2)[../../../../img/PGNaming2.PNG]
!(PGNaming3)[../../../../img/PGNaming3.PNG]
Based on the feedback of the infotaiment team, each process group is a different application (microservice) and it's visible in the kubernetes container/workload
within the metadata of each Process Group.
#### How to create a Process Group Detection Rule
1. Open the *conditional-naming-processgroup.yaml* file and create a rule that looks like this:
```
config:
- CDInfotainmentRule1: template.json
CDInfotainmentRule1:
- name: Infotainment Rule 1
- nameFormat: {ProcessGroup:KubernetesNamespace} - {ProcessGroup:KubernetesContainerName}
- tag: Infotainment
- skipDeployment: false
```
The result of the rule will be renaming the PG to this:
```
bon-information-prod ipa
bon-information-prod rsl
```
Other possible placeholders that you can use are for example:
{ProcessGroup:KubernetesNamespace} - {ProcessGroup:KubernetesContainerName/[^\\-]*$}
{ProcessGroup:KubernetesNamespace} - {ProcessGroup:KubernetesFullPodName/buffet-(.*?)-}
{ProcessGroup:DetectedName} - {HostGroup:Name/[^\\_]*$}
{ProcessGroup:KubernetesNamespace}
{ProcessGroup:CommandLineArgs/.*?\\-f\\s\\/www\\/(.*?)\\/generated\\/httpd\\.conf.*?}
You can combine different ones. Check the (documentation)[link] for more

View File

@ -0,0 +1,8 @@
config:
- CDAPIM: template.json
CDAPIM:
- name: MyProcessNamingRule
- nameFormat: "{ProcessGroup:KubernetesNamespace/regex-example}"
- tag: APIM
- skipDeployment: "true"

View File

@ -0,0 +1,29 @@
{
"displayName": "{{.name}}",
"enabled": true,
"metadata": {
"clusterVersion": "1.214.107.20210407-223952",
"configurationVersions": [
0
]
},
"nameFormat": "{{.nameFormat}}",
"rules": [
{
"comparisonInfo": {
"negate": false,
"operator": "EQUALS",
"type": "TAG",
"value": {
"context": "CONTEXTLESS",
"key": "Component",
"value": "{{.tag}}"
}
},
"key": {
"attribute": "PROCESS_GROUP_TAGS"
}
}
],
"type": "PROCESS_GROUP"
}

View File

@ -0,0 +1,35 @@
### Service Naming Rules
A typical case could be that you access to *Transaction & Services* and you find two services that are exactly the same:
*DataDownloadV1*
*DataDownloadV1*
If you drilldown into the service and you check in the process group, you may have a PROD and a E2E for each service.
*Note: if you see that both process group are exactly the same, please contact a Dynatrace expert to create a Process*
*Group detection rule*
In the case the PG are PROD and E2E, then we need to create a rule that looks like this:
```
config:
- CDInfotainmentRule1: template.json
CDInfotainmentRule1:
- name: Infotainment Rule 1
- nameFormat: {Service:DetectedName} - {ProcessGroup:KubernetesNamespace/[^-]+$}
- tag: Infotainment
- skipDeployment: false
```
The rule will get the Service Detected Name (current name) and it will extract (with a regex) the part of the kubernetes namespace after the "-", so -prod or -e2e, resulting in:
*DataDownloadV1 - prod*
*DataDownloadV1 - e2e*
Now, services will be easy to identify.
You can create rules based on any property/metadata. Some other placeholder's eamples:
{Service:DatabaseName} - E2E
{Service:WebServiceName} - {ProcessGroup:Kubernetes:microservice} - {ProcessGroup:Kubernetes:environment}
{Service:DetectedName} - {ProcessGroup:KubernetesContainerName} - {ProcessGroup:KubernetesNamespace/[^-]+$}
{Service:DetectedName} - {ProcessGroup:SpringBootProfileName/[^\\-]*$}

View File

@ -0,0 +1,8 @@
config:
- CDAPIM: template.json
CDAPIM:
- name: MyProcessNamingRule
- nameFormat: "{ProcessGroup:KubernetesNamespace/regex-example}"
- tag: APIM
- skipDeployment: "true"

View File

@ -0,0 +1,29 @@
{
"displayName": "{{.name}}",
"enabled": true,
"metadata": {
"clusterVersion": "1.214.107.20210407-223952",
"configurationVersions": [
0
]
},
"nameFormat": "{{.nameFormat}}",
"rules": [
{
"comparisonInfo": {
"negate": false,
"operator": "EQUALS",
"type": "TAG",
"value": {
"context": "CONTEXTLESS",
"key": "Component",
"value": "{{.tag}}"
}
},
"key": {
"attribute": "SERVICE_TAGS"
}
}
],
"type": "SERVICE"
}

View File

@ -0,0 +1,4 @@
### How to configure custom services?
Please refer to [this](https://atc.bmwgroup.net/confluence/display/OPMAAS/Documentation+%7C+Custom+Services) page to configure your custom services.

View File

@ -0,0 +1,9 @@
config:
- customService1: template-1-1.json
customService1:
- name: myJOYNRService
- className: com.bmw.cc.conn.this.is.just.an.exampleClasss
- methodName: exampleJoynrMethod
- returnType: void
- skipDeployment: "true"

View File

@ -0,0 +1,23 @@
{
"enabled": true,
"name": "{{.name}}",
"processGroups": [],
"queueEntryPoint": false,
"queueEntryPointType": null,
"rules": [
{
"annotations": [],
"className": "{{.className}}",
"enabled": true,
"fileName": "",
"matcher": "EQUALS",
"methodRules": [
{
"argumentTypes": [],
"methodName": "{{.methodName}}",
"returnType": "{{.returnType}}"
}
]
}
]
}

View File

@ -0,0 +1,13 @@
## Update dashboard configuration
- Configuration changes (like in dashboards, alerting profiles) must be done via a pull request. Changing a dashboard just in the environment, will cause that it will be overwritten by Monaco.
- How to generate changes in your dashboards?
1. Modify the dashboard within the Dynatrace UI with the intended changes.
2. Copy the JSON of the dashboards. (Can be found under the dashboard settings)
3. Paste the copied JSON under the Monaco JSON, overwrite it.
4. Commit and pull request to merge the branch to the master:
```
git add <changes>
git commit -m "<app_name> configuration changes"
git push -u origin <branch>
```

View File

@ -0,0 +1,127 @@
config:
- CDAPIM-PROD: default.json
- CDAPIM-E2E: default.json
- CDAPIM-INT: default.json
- CDAPIM-TEST: default.json
#PROD dashboards for EMEA/NA/CN Prod
#Dry-run needed for all hubs
CDAPIM-PROD:
- name: CD_APIM PROD
- mzName: CD_APIM/management-zone/CDAPIM.name
- mzId: CD_APIM/management-zone/CDAPIM.id
- env: PROD
- skipDeployment: "true"
#Configuration
CDAPIM-PROD.EMEA-Prod:
- name: CD_APIM PROD
- mzName: CD_APIM/management-zone/CDAPIM.name
- mzId: CD_APIM/management-zone/CDAPIM.id
- tag: APIM
- env: PROD
- skipDeployment: "false"
CDAPIM-PROD.NA-Prod:
- name: CD_APIM PROD
- mzName: CD_APIM/management-zone/CDAPIM.name
- mzId: CD_APIM/management-zone/CDAPIM.id
- tag: APIM
- env: PROD
- skipDeployment: "false"
CDAPIM-PROD.CN-Prod:
- name: CD_APIM PROD
- mzName: CD_APIM/management-zone/CDAPIM.name
- mzId: CD_APIM/management-zone/CDAPIM.id
- tag: APIM
- env: PROD
- skipDeployment: "false"
#E2E dashboards for EMEA/NA/CN E2E
#Dry-run needed for all hubs
CDAPIM-E2E:
- name: CD_APIM E2E
- mzName: CD_APIM/management-zone/CDAPIM.name
- mzId: CD_APIM/management-zone/CDAPIM.id
- env: E2E
- skipDeployment: "true"
#Configuration
CDAPIM-E2E.EMEA-Prod:
- name: CD_APIM E2E
- mzName: CD_APIM/management-zone/CDAPIM.name
- mzId: CD_APIM/management-zone/CDAPIM.id
- env: E2E
- tag: APIM
- skipDeployment: "true"
CDAPIM-E2E.NA-Prod:
- name: CD_APIM E2E
- mzName: CD_APIM/management-zone/CDAPIM.name
- mzId: CD_APIM/management-zone/CDAPIM.id
- env: E2E
- tag: APIM
- skipDeployment: "true"
CDAPIM-E2E.CN-Prod:
- name: CD_APIM E2E
- mzName: CD_APIM/management-zone/CDAPIM.name
- mzId: CD_APIM/management-zone/CDAPIM.id
- env: E2E
- tag: APIM
- skipDeployment: "true"
#INT dashboards for EMEA/NA/CN
#Dry-run needed for all hubs
CDAPIM-INT:
- name: CD_APIM INT
- mzName: CD_APIM/management-zone/CDAPIM.name
- mzId: CD_APIM/management-zone/CDAPIM.id
- env: INT
- tag: APIM
- skipDeployment: "true"
#Configuration
CDAPIM-INT.EMEA-PreProd:
- name: CD_APIM INT
- mzName: CD_APIM/management-zone/CDAPIM.name
- mzId: CD_APIM/management-zone/CDAPIM.id
- env: INT
- tag: APIM
- skipDeployment: "false"
CDAPIM-INT.NA-PreProd:
- name: CD_APIM INT
- mzName: CD_APIM/management-zone/CDAPIM.name
- mzId: CD_APIM/management-zone/CDAPIM.id
- env: INT
- skipDeployment: "false"
CDAPIM-INT.CN-PreProd:
- name: CD_APIM INT
- mzName: CD_APIM/management-zone/CDAPIM.name
- mzId: CD_APIM/management-zone/CDAPIM.id
- env: INT
- skipDeployment: "false"
#TEST dashboards for EMEA/NA/CN
#Dry-run needed for all hubs
CDAPIM-TEST:
- name: CD_APIM TEST
- mzName: CD_APIM/management-zone/CDAPIM.name
- mzId: CD_APIM/management-zone/CDAPIM.id
- tag: APIM
- env: TEST
- skipDeployment: "true"
#Configuration
CDAPIM-TEST.EMEA-PreProd:
- name: CD_APIM TEST
- mzName: CD_APIM/management-zone/CDAPIM.name
- mzId: CD_APIM/management-zone/CDAPIM.id
- tag: APIM
- env: TEST
- skipDeployment: "false"
CDAPIM-TEST.NA-PreProd:
- name: CD_APIM TEST
- mzName: CD_APIM/management-zone/CDAPIM.name
- mzId: CD_APIM/management-zone/CDAPIM.id
- env: TEST
- skipDeployment: "false"
CDAPIM-TEST.CN-PreProd:
- name: CD_APIM TEST
- mzName: CD_APIM/management-zone/CDAPIM.name
- mzId: CD_APIM/management-zone/CDAPIM.id
- env: TEST
- skipDeployment: "false"

View File

@ -0,0 +1,308 @@
{
"metadata": {
"configurationVersions": [
3
],
"clusterVersion": "1.214.107.20210407-223952"
},
"dashboardMetadata": {
"name": "{{.name}}",
"shared": true,
"owner": "Ignacio.Goldman@partner.bmwgroup.com",
"dashboardFilter": {
"timeframe": "-24h to now"
},
"tags": [
"{{.tag}}"
]
},
"tiles": [
{
"name": "Custom chart",
"tileType": "CUSTOM_CHARTING",
"configured": true,
"bounds": {
"top": 228,
"left": 38,
"width": 1064,
"height": 304
},
"tileFilter": {},
"filterConfig": {
"type": "MIXED",
"customName": "Failure rate (HTTP 4xx/5xx errors)",
"defaultName": "Custom chart",
"chartConfig": {
"legendShown": true,
"type": "TIMESERIES",
"series": [
{
"metric": "builtin:service.errors.fourxx.rate",
"aggregation": "AVG",
"type": "BAR",
"entityType": "SERVICE",
"dimensions": [],
"sortAscending": false,
"sortColumn": false,
"aggregationRate": "TOTAL"
},
{
"metric": "builtin:service.errors.fivexx.rate",
"aggregation": "AVG",
"type": "BAR",
"entityType": "SERVICE",
"dimensions": [],
"sortAscending": false,
"sortColumn": true,
"aggregationRate": "TOTAL"
}
],
"resultMetadata": {
"nullbuiltin:service.errors.fivexx.rate|AVG|TOTAL|BAR|SERVICE": {
"lastModified": 1617956393463,
"customColor": "#ff0000"
},
"nullbuiltin:service.errors.fourxx.rate|AVG|TOTAL|BAR|SERVICE": {
"lastModified": 1617956441725,
"customColor": "#fff29a"
}
}
},
"filtersPerEntityType": {
"SERVICE": {
"AUTO_TAGS": [
"Environment:{{.env}}",
"Component:{{.tag}}"
]
}
}
}
},
{
"name": "Problems",
"tileType": "OPEN_PROBLEMS",
"configured": true,
"bounds": {
"top": 38,
"left": 950,
"width": 152,
"height": 152
},
"tileFilter": {
"managementZone": {
"id": "{{.mzId}}",
"name": "{{.mzName}}"
}
}
},
{
"name": "Overall Health",
"tileType": "HEADER",
"configured": true,
"bounds": {
"top": 0,
"left": 38,
"width": 1064,
"height": 38
},
"tileFilter": {}
},
{
"name": "Markdown",
"tileType": "MARKDOWN",
"configured": true,
"bounds": {
"top": 532,
"left": 38,
"width": 1064,
"height": 38
},
"tileFilter": {},
"markdown": "---\n"
},
{
"name": "Custom chart",
"tileType": "CUSTOM_CHARTING",
"configured": true,
"bounds": {
"top": 570,
"left": 38,
"width": 1064,
"height": 304
},
"tileFilter": {},
"filterConfig": {
"type": "MIXED",
"customName": "Response time, Request Count and Number of Errors",
"defaultName": "Custom chart",
"chartConfig": {
"legendShown": true,
"type": "TIMESERIES",
"series": [
{
"metric": "builtin:service.response.time",
"aggregation": "AVG",
"type": "LINE",
"entityType": "SERVICE",
"dimensions": [],
"sortAscending": false,
"sortColumn": false,
"aggregationRate": "TOTAL"
},
{
"metric": "builtin:service.requestCount.total",
"aggregation": "NONE",
"type": "BAR",
"entityType": "SERVICE",
"dimensions": [],
"sortAscending": false,
"sortColumn": false,
"aggregationRate": "TOTAL"
},
{
"metric": "builtin:service.errors.total.count",
"aggregation": "NONE",
"type": "BAR",
"entityType": "SERVICE",
"dimensions": [],
"sortAscending": false,
"sortColumn": true,
"aggregationRate": "TOTAL"
}
],
"resultMetadata": {
"nullbuiltin:service.requestCount.total|NONE|TOTAL|BAR|SERVICE": {
"lastModified": 1595275720776,
"customColor": "#008cdb"
},
"nullbuiltin:service.errors.total.count|NONE|TOTAL|BAR|SERVICE": {
"lastModified": 1595275955999,
"customColor": "#ef651f"
},
"nullbuiltin:service.response.time|AVG|TOTAL|LINE|SERVICE": {
"lastModified": 1595275686773,
"customColor": "#b4e5f9"
}
}
},
"filtersPerEntityType": {
"SERVICE": {
"AUTO_TAGS": [
"Environment:{{.env}}",
"Component:{{.tag}}"
]
}
}
}
},
{
"name": "Markdown",
"tileType": "MARKDOWN",
"configured": true,
"bounds": {
"top": 190,
"left": 38,
"width": 1064,
"height": 38
},
"tileFilter": {},
"markdown": "---\n"
},
{
"name": "",
"tileType": "DATABASES_OVERVIEW",
"configured": true,
"bounds": {
"top": 38,
"left": 646,
"width": 190,
"height": 152
},
"tileFilter": {},
"filterConfig": {
"type": "DATABASE",
"customName": "Databases",
"defaultName": "Databases",
"chartConfig": {
"legendShown": true,
"type": "TIMESERIES",
"series": [],
"resultMetadata": {}
},
"filtersPerEntityType": {
"DATABASE": {
"AUTO_TAGS": [
"Environment:{{.env}}",
"Component:{{.tag}}"
]
}
}
},
"chartVisible": true
},
{
"name": "",
"tileType": "SERVICES",
"configured": true,
"bounds": {
"top": 38,
"left": 342,
"width": 190,
"height": 152
},
"tileFilter": {},
"filterConfig": {
"type": "SERVICE",
"customName": "Services",
"defaultName": "Services",
"chartConfig": {
"legendShown": true,
"type": "TIMESERIES",
"series": [],
"resultMetadata": {}
},
"filtersPerEntityType": {
"SERVICE": {
"AUTO_TAGS": [
"Environment:{{.env}}",
"Component:{{.tag}}"
]
}
}
},
"chartVisible": true
},
{
"name": "",
"tileType": "HOSTS",
"configured": true,
"bounds": {
"top": 38,
"left": 38,
"width": 190,
"height": 152
},
"tileFilter": {},
"filterConfig": {
"type": "HOST",
"customName": "Hosts",
"defaultName": "Hosts",
"chartConfig": {
"legendShown": true,
"type": "TIMESERIES",
"series": [],
"resultMetadata": {}
},
"filtersPerEntityType": {
"HOST": {
"AUTO_TAGS": [
"Environment:{{.env}}",
"Component:{{.tag}}"
]
}
}
},
"chartVisible": true
}
]
}

View File

@ -0,0 +1,60 @@
## Configure Notification System
### MS Teams - Default
*Let's suppose you would like to start receiving alerts from Dynatrace via MS Teams just for your *EMEA PROD*.*
1. Open *notification.yaml* under your application configuration folder. By default, all notification systems are configured via MS Teams with an
https://empty webhook (not configured).
2. Create an incoming webhook in MS Teams. [How to?](https://www.dynatrace.com/support/help/shortlink/set-up-msteams-integration#configuration-in-microsoft-teams)
3. Add the incoming webhook under the webhook parameter for the `<app_name>-PROD.EMEA-Prod`:
```
<app_name>-PROD.EMEA-Prod:
- name: CD_<app_name> PROD
- alertingProfile: CD_<app_name>/alerting-profile/CD<app_name>-PROD.id
- webhook: <Add webhook here>
- skipDeployment: "false"
```
4. Save and commit changes:
```
git add <changes>
git commit -m "<app_name> configuration changes"
git push -u origin <branch>
```
Note: If you want to enable MS Teams for any other hub/stage, follow the same steps but make sure you're under the right configuration:
`<app_name>-<stage>.<dynatrace-env>-<stage>:`
### Email
*The team prefers to be alerted via email, not MS Teams*
1. Keep the MS Teams integration disabled, with the https://empty webhook:
```
<app_name>-PROD.EMEA-Prod:
- name: CD_<app_name> PROD
- alertingProfile: CD_<app_name>/alerting-profile/CD<app_name>-PROD.id
- webhook: https://empty
- skipDeployment: "false"
```
2. Create a new configuration template under config, using the email template:
```
config:
- CD<app_name>email: email.json
```
3. Describe the configuration below, using the following template:
```
CD<app_name>email.EMEA-Prod:
- name: CD_<app_name> PROD
- alertingProfile: CD_<app_name>/alerting-profile/CD<app_name>-PROD.id
- receivers: distributionEmailexample@bmw.de`
```
4. Save and commit changes:
```
git add <changes>
git commit -m "<app_name> configuration changes"
git push -u origin <branch>
```
### ITSM
Coming soon!

View File

@ -0,0 +1,13 @@
{
"active": true,
"alertingProfile": "{{.alertingProfile}}",
"bccReceivers": [],
"body": "{ProblemDetailsHTML}",
"ccReceivers": [],
"name": "{{.name}}",
"receivers": [
"{{.receivers}}"
],
"subject": "{State} Problem {ProblemID}: {ImpactedEntity}",
"type": "EMAIL"
}

View File

@ -1,7 +1,7 @@
{ {
"acceptAnyCertificate": false, "acceptAnyCertificate": false,
"active": true, "active": true,
"alertingProfile": "{{.apid}}", "alertingProfile": "{{.alertingProfile}}",
"headers": [], "headers": [],
"name": "{{.name}}", "name": "{{.name}}",
"notifyEventMergesEnabled": false, "notifyEventMergesEnabled": false,

View File

@ -0,0 +1,51 @@
config:
- CDAPIM-PROD: msTeams.json
- CDAPIM-INT: msTeams.json
#Prod notification system for EMEA/NA/CN
#Dry-run needed for all hubs
CDAPIM-PROD:
- name: CD_APIM PROD
- alertingProfile: CD_APIM/alerting-profile/CDAPIM-PROD.id
- webhook: https://empty
- skipDeployment: "true"
#Configuration
CDAPIM-PROD.EMEA-Prod:
- name: CD_APIM PROD
- alertingProfile: CD_APIM/alerting-profile/CDAPIM-PROD.id
- webhook: https://empty
- skipDeployment: "false"
CDAPIM-PROD.NA-Prod:
- name: CD_APIM PROD
- alertingProfile: CD_APIM/alerting-profile/CDAPIM-PROD.id
- webhook: https://empty
- skipDeployment: "false"
CDAPIM-PROD.CN-Prod:
- name: CD_APIM PROD
- alertingProfile: CD_APIM/alerting-profile/CDAPIM-PROD.id
- webhook: https://empty
- skipDeployment: "false"
#INT notification system for EMEA/NA/CN
#Dry-run needed for all hubs
CDAPIM-INT:
- name: CD_APIM INT
- alertingProfile: CD_APIM/alerting-profile/CDAPIM-INT.id
- webhook: https://empty
- skipDeployment: "true"
#Configuration
CDAPIM-INT.EMEA-PreProd:
- name: CD_APIM INT
- alertingProfile: CD_APIM/alerting-profile/CDAPIM-INT.id
- webhook: https://empty
- skipDeployment: "false"
CDAPIM-INT.NA-PreProd:
- name: CD_APIM INT
- alertingProfile: CD_APIM/alerting-profile/CDAPIM-INT.id
- webhook: https://empty
- skipDeployment: "false"
CDAPIM-INT.CN-PreProd:
- name: CD_APIM INT
- alertingProfile: CD_APIM/alerting-profile/CDAPIM-INT.id
- webhook: https://empty
- skipDeployment: "false"

View File

@ -0,0 +1,4 @@
### How to configure synthetics?
Please refer to [this](https://atc.bmwgroup.net/confluence/display/OPMAAS/Documentation+%7C+Synthetic+Monitors) page to configure your synthetics.

View File

@ -0,0 +1,82 @@
{
"anomalyDetection": {
"loadingTimeThresholds": {
"enabled": false,
"thresholds": [
{
"type": "TOTAL",
"valueMs": 0
}
]
},
"outageHandling": {
"globalOutage": true,
"localOutage": false,
"localOutagePolicy": {
"affectedLocations": 1,
"consecutiveRuns": 3
}
}
},
"automaticallyAssignedApps": [],
"enabled": true,
"frequencyMin": 1,
"locations": [
"{{.location}}"
],
"managementZones": [
{
"id": "{{.mzId}}",
"name": "{{.mzName}}"
}
],
"manuallyAssignedApps": [],
"name": "{{.name}}",
"requests": [
{
"entityId": "HTTP_CHECK_STEP-0BA53EC80CD7EE5A",
"name": "{{.name}}",
"sequenceNumber": 1
}
],
"script": {
"requests": [
{
"configuration": {
"acceptAnyCertificate": true,
"followRedirects": true,
"requestHeaders": [
{
"name": "accept",
"value": "application/json"
},
{
"name": "Content-Type",
"value": "application/json"
},
{
"name": "api_key",
"value": "355DE89C-7B72-4EA3-BDD8-157C79EB2C23"
}
]
},
"description": "{{.name}}",
"method": "GET",
"url": "{{.endpoint}}",
"validation": {
"rules": [
{
"passIfFound": true,
"type": "httpStatusesList",
"value": "200"
}
],
"rulesChaining": "or"
}
}
],
"version": "1.0"
},
"tags": [],
"type": "HTTP"
}

View File

@ -0,0 +1,10 @@
config:
- APIM: default.json
APIM:
- name: CD_APIM - <synthetic-name>
- mzName: CD_APIM/management-zone/CDAPIM.name
- mzId: CD_APIM/management-zone/CDAPIM.id
- endpoint: <url>
- location: <location>
- skipDeployment: "true"

View File

@ -1,92 +0,0 @@
{
"displayName": "{{.name}}",
"eventTypeFilters": [],
"managementZoneId": "{{.mzId}}",
"mzId": "{{.mzId}}",
"rules": [
{
"delayInMinutes": 0,
"severityLevel": "AVAILABILITY",
"tagFilter": {
"includeMode": "INCLUDE_ANY",
"tagFilters": [
{
"context": "CONTEXTLESS",
"key": "Component",
"value": "{{.tag}}"
}
]
}
},
{
"delayInMinutes": 10,
"severityLevel": "ERROR",
"tagFilter": {
"includeMode": "INCLUDE_ANY",
"tagFilters": [
{
"context": "CONTEXTLESS",
"key": "Component",
"value": "{{.tag}}"
}
]
}
},
{
"delayInMinutes": 30,
"severityLevel": "PERFORMANCE",
"tagFilter": {
"includeMode": "INCLUDE_ANY",
"tagFilters": [
{
"context": "CONTEXTLESS",
"key": "Component",
"value": "{{.tag}}"
}
]
}
},
{
"delayInMinutes": 30,
"severityLevel": "RESOURCE_CONTENTION",
"tagFilter": {
"includeMode": "INCLUDE_ANY",
"tagFilters": [
{
"context": "CONTEXTLESS",
"key": "Component",
"value": "{{.tag}}"
}
]
}
},
{
"delayInMinutes": 10,
"severityLevel": "CUSTOM_ALERT",
"tagFilter": {
"includeMode": "INCLUDE_ANY",
"tagFilters": [
{
"context": "CONTEXTLESS",
"key": "Component",
"value": "{{.tag}}"
}
]
}
},
{
"delayInMinutes": 0,
"severityLevel": "MONITORING_UNAVAILABLE",
"tagFilter": {
"includeMode": "INCLUDE_ANY",
"tagFilters": [
{
"context": "CONTEXTLESS",
"key": "Component",
"value": "{{.tag}}"
}
]
}
}
]
}

View File

@ -1,6 +1,60 @@
CDASBC-HAL: config:
- name: CD_ASBC-HAL/management-zone/CDASBC-HAL.name - CDASBC-HAL-PROD: default.json
- CDASBC-HAL-INT: default.json
#Prod alerting profiles for EMEA/NA/CN
#Dry-run needed for all hubs
CDASBC-HAL-PROD:
- name: CD_ASBC-HAL PROD
- tag: ASBC-HAL - tag: ASBC-HAL
- mzId: CD_ASBC-HAL/management-zone/CDASBC-HAL.id - mzId: CD_ASBC-HAL/management-zone/CDASBC-HAL.id
config: - env: PROD
- CDASBC-HAL: ASBC-HAL.json - skipDeployment: "true"
#Configuration
CDASBC-HAL-PROD.EMEA-Prod:
- name: CD_ASBC-HAL PROD
- tag: ASBC-HAL
- mzId: CD_ASBC-HAL/management-zone/CDASBC-HAL.id
- env: PROD
- skipDeployment: "false"
CDASBC-HAL-PROD.NA-Prod:
- name: CD_ASBC-HAL PROD
- tag: ASBC-HAL
- mzId: CD_ASBC-HAL/management-zone/CDASBC-HAL.id
- env: PROD
- skipDeployment: "false"
CDASBC-HAL-PROD.CN-Prod:
- name: CD_ASBC-HAL PROD
- tag: ASBC-HAL
- mzId: CD_ASBC-HAL/management-zone/CDASBC-HAL.id
- env: PROD
- skipDeployment: "false"
#INT alerting profiles for EMEA/NA/CN
#Dry-run needed for all hubs
CDASBC-HAL-INT:
- name: CD_ASBC-HAL INT
- tag: ASBC-HAL
- mzId: CD_ASBC-HAL/management-zone/CDASBC-HAL.id
- env: INT
- skipDeployment: "true"
#Configuration
CDASBC-HAL-INT.EMEA-PreProd:
- name: CD_ASBC-HAL INT
- tag: ASBC-HAL
- mzId: CD_ASBC-HAL/management-zone/CDASBC-HAL.id
- env: INT
- skipDeployment: "false"
CDASBC-HAL-INT.NA-PreProd:
- name: CD_ASBC-HAL INT
- tag: ASBC-HAL
- mzId: CD_ASBC-HAL/management-zone/CDASBC-HAL.id
- env: INT
- skipDeployment: "false"
CDASBC-HAL-INT.CN-PreProd:
- name: CD_ASBC-HAL INT
- tag: ASBC-HAL
- mzId: CD_ASBC-HAL/management-zone/CDASBC-HAL.id
- env: INT
- skipDeployment: "false"

View File

@ -8,12 +8,17 @@
"delayInMinutes": 0, "delayInMinutes": 0,
"severityLevel": "AVAILABILITY", "severityLevel": "AVAILABILITY",
"tagFilter": { "tagFilter": {
"includeMode": "INCLUDE_ANY", "includeMode": "INCLUDE_ALL",
"tagFilters": [ "tagFilters": [
{ {
"context": "CONTEXTLESS", "context": "CONTEXTLESS",
"key": "Component", "key": "Component",
"value": "{{.tag}}" "value": "{{.tag}}"
},
{
"context": "CONTEXTLESS",
"key": "Environment",
"value": "{{.env}}"
} }
] ]
} }
@ -22,12 +27,17 @@
"delayInMinutes": 10, "delayInMinutes": 10,
"severityLevel": "ERROR", "severityLevel": "ERROR",
"tagFilter": { "tagFilter": {
"includeMode": "INCLUDE_ANY", "includeMode": "INCLUDE_ALL",
"tagFilters": [ "tagFilters": [
{ {
"context": "CONTEXTLESS", "context": "CONTEXTLESS",
"key": "Component", "key": "Component",
"value": "{{.tag}}" "value": "{{.tag}}"
},
{
"context": "CONTEXTLESS",
"key": "Environment",
"value": "{{.env}}"
} }
] ]
} }
@ -36,12 +46,17 @@
"delayInMinutes": 30, "delayInMinutes": 30,
"severityLevel": "PERFORMANCE", "severityLevel": "PERFORMANCE",
"tagFilter": { "tagFilter": {
"includeMode": "INCLUDE_ANY", "includeMode": "INCLUDE_ALL",
"tagFilters": [ "tagFilters": [
{ {
"context": "CONTEXTLESS", "context": "CONTEXTLESS",
"key": "Component", "key": "Component",
"value": "{{.tag}}" "value": "{{.tag}}"
},
{
"context": "CONTEXTLESS",
"key": "Environment",
"value": "{{.env}}"
} }
] ]
} }
@ -50,12 +65,17 @@
"delayInMinutes": 30, "delayInMinutes": 30,
"severityLevel": "RESOURCE_CONTENTION", "severityLevel": "RESOURCE_CONTENTION",
"tagFilter": { "tagFilter": {
"includeMode": "INCLUDE_ANY", "includeMode": "INCLUDE_ALL",
"tagFilters": [ "tagFilters": [
{ {
"context": "CONTEXTLESS", "context": "CONTEXTLESS",
"key": "Component", "key": "Component",
"value": "{{.tag}}" "value": "{{.tag}}"
},
{
"context": "CONTEXTLESS",
"key": "Environment",
"value": "{{.env}}"
} }
] ]
} }
@ -64,26 +84,17 @@
"delayInMinutes": 10, "delayInMinutes": 10,
"severityLevel": "CUSTOM_ALERT", "severityLevel": "CUSTOM_ALERT",
"tagFilter": { "tagFilter": {
"includeMode": "INCLUDE_ANY", "includeMode": "INCLUDE_ALL",
"tagFilters": [ "tagFilters": [
{ {
"context": "CONTEXTLESS", "context": "CONTEXTLESS",
"key": "Component", "key": "Component",
"value": "{{.tag}}" "value": "{{.tag}}"
} },
] {
}
},
{
"delayInMinutes": 0,
"severityLevel": "MONITORING_UNAVAILABLE",
"tagFilter": {
"includeMode": "INCLUDE_ANY",
"tagFilters": [
{
"context": "CONTEXTLESS", "context": "CONTEXTLESS",
"key": "Component", "key": "Environment",
"value": "{{.tag}}" "value": "{{.env}}"
} }
] ]
} }

View File

@ -0,0 +1,10 @@
## Custom metrics - Multidimensional Analysis
Under the Multidimensional Analysis you're able to save a view but not to create a metric. Instead, you can do it in here:
1. Create the metric within the Dynatrace UI using the Mutidimensional Analysis view.
2. Save the view and create a ticket for the OPAPM team [here](link). Please provide the following information:
- View created in the Dynatrace UI
- Your Dynatrace configuration folder (i.e. CD_<app_name>)
The OPAPM team will proceed creating the metric and updating your configuration in monaco.

View File

@ -0,0 +1,67 @@
### Process Group Detection Rules and Naming
#### Detection Rule or Naming?
For the explanation, we're using a real example of the Infotainment application:
!(PGNaming1)[../../../../img/PGNaming1.PNG]
Before working with your dashboards and alerting profiles, an important task to do when working with Dynatrace is checking
the structure of your applications (process groups). You can do that clicking under *technologies* and filter using your
application Management Zone.
In the picture above, there are two Process Groups called bon-information-prod. **If you see duplicated process groups like in**
**this case, you MUST follow this guideline**
Next step would be to open both process groups and compare the metadata. In that way, you can identify if all process instances are
part of the same application or not. An easy way to do that is asking yourself: how many instances of my application do i have?
If you have 4 instances in total and you're able to see 2 in one PG and other 2 in other PG it means that **they are part of the **
**same application**
Another situation could be that checking on the metadata, then you see that are **two different application** and Dynatrace is just naming
the process group in the same way
*Same application*
- Problem: Dynatrace is creating two different process groups, what transalates in two separated services for the same application. Instead of
seeing all the traffic in one service, you will have it splitted and it will complicate your monitoring
- Solution: create a process group detection rule. Contact Dynatrace Expert
*Different application*
- Problem: Dynatrace is just naming in the same way applications that are different.
- Solution: This case is less severe, since it can be fixed with a process group naming rule.
What about our example?
!(PGNaming2)[../../../../img/PGNaming2.PNG]
!(PGNaming3)[../../../../img/PGNaming3.PNG]
Based on the feedback of the infotaiment team, each process group is a different application (microservice) and it's visible in the kubernetes container/workload
within the metadata of each Process Group.
#### How to create a Process Group Detection Rule
1. Open the *conditional-naming-processgroup.yaml* file and create a rule that looks like this:
```
config:
- CDInfotainmentRule1: template.json
CDInfotainmentRule1:
- name: Infotainment Rule 1
- nameFormat: {ProcessGroup:KubernetesNamespace} - {ProcessGroup:KubernetesContainerName}
- tag: Infotainment
- skipDeployment: false
```
The result of the rule will be renaming the PG to this:
```
bon-information-prod ipa
bon-information-prod rsl
```
Other possible placeholders that you can use are for example:
{ProcessGroup:KubernetesNamespace} - {ProcessGroup:KubernetesContainerName/[^\\-]*$}
{ProcessGroup:KubernetesNamespace} - {ProcessGroup:KubernetesFullPodName/buffet-(.*?)-}
{ProcessGroup:DetectedName} - {HostGroup:Name/[^\\_]*$}
{ProcessGroup:KubernetesNamespace}
{ProcessGroup:CommandLineArgs/.*?\\-f\\s\\/www\\/(.*?)\\/generated\\/httpd\\.conf.*?}
You can combine different ones. Check the (documentation)[link] for more

View File

@ -0,0 +1,8 @@
config:
- CDASBC-HAL: template.json
CDASBC-HAL:
- name: MyProcessNamingRule
- nameFormat: "{ProcessGroup:KubernetesNamespace/regex-example}"
- tag: ASBC-HAL
- skipDeployment: "true"

View File

@ -0,0 +1,29 @@
{
"displayName": "{{.name}}",
"enabled": true,
"metadata": {
"clusterVersion": "1.214.107.20210407-223952",
"configurationVersions": [
0
]
},
"nameFormat": "{{.nameFormat}}",
"rules": [
{
"comparisonInfo": {
"negate": false,
"operator": "EQUALS",
"type": "TAG",
"value": {
"context": "CONTEXTLESS",
"key": "Component",
"value": "{{.tag}}"
}
},
"key": {
"attribute": "PROCESS_GROUP_TAGS"
}
}
],
"type": "PROCESS_GROUP"
}

View File

@ -0,0 +1,35 @@
### Service Naming Rules
A typical case could be that you access to *Transaction & Services* and you find two services that are exactly the same:
*DataDownloadV1*
*DataDownloadV1*
If you drilldown into the service and you check in the process group, you may have a PROD and a E2E for each service.
*Note: if you see that both process group are exactly the same, please contact a Dynatrace expert to create a Process*
*Group detection rule*
In the case the PG are PROD and E2E, then we need to create a rule that looks like this:
```
config:
- CDInfotainmentRule1: template.json
CDInfotainmentRule1:
- name: Infotainment Rule 1
- nameFormat: {Service:DetectedName} - {ProcessGroup:KubernetesNamespace/[^-]+$}
- tag: Infotainment
- skipDeployment: false
```
The rule will get the Service Detected Name (current name) and it will extract (with a regex) the part of the kubernetes namespace after the "-", so -prod or -e2e, resulting in:
*DataDownloadV1 - prod*
*DataDownloadV1 - e2e*
Now, services will be easy to identify.
You can create rules based on any property/metadata. Some other placeholder's eamples:
{Service:DatabaseName} - E2E
{Service:WebServiceName} - {ProcessGroup:Kubernetes:microservice} - {ProcessGroup:Kubernetes:environment}
{Service:DetectedName} - {ProcessGroup:KubernetesContainerName} - {ProcessGroup:KubernetesNamespace/[^-]+$}
{Service:DetectedName} - {ProcessGroup:SpringBootProfileName/[^\\-]*$}

View File

@ -0,0 +1,8 @@
config:
- CDASBC-HAL: template.json
CDASBC-HAL:
- name: MyProcessNamingRule
- nameFormat: "{ProcessGroup:KubernetesNamespace/regex-example}"
- tag: ASBC-HAL
- skipDeployment: "true"

View File

@ -0,0 +1,29 @@
{
"displayName": "{{.name}}",
"enabled": true,
"metadata": {
"clusterVersion": "1.214.107.20210407-223952",
"configurationVersions": [
0
]
},
"nameFormat": "{{.nameFormat}}",
"rules": [
{
"comparisonInfo": {
"negate": false,
"operator": "EQUALS",
"type": "TAG",
"value": {
"context": "CONTEXTLESS",
"key": "Component",
"value": "{{.tag}}"
}
},
"key": {
"attribute": "SERVICE_TAGS"
}
}
],
"type": "SERVICE"
}

View File

@ -0,0 +1,4 @@
### How to configure custom services?
Please refer to [this](https://atc.bmwgroup.net/confluence/display/OPMAAS/Documentation+%7C+Custom+Services) page to configure your custom services.

View File

@ -0,0 +1,9 @@
config:
- customService1: template-1-1.json
customService1:
- name: myJOYNRService
- className: com.bmw.cc.conn.this.is.just.an.exampleClasss
- methodName: exampleJoynrMethod
- returnType: void
- skipDeployment: "true"

View File

@ -0,0 +1,23 @@
{
"enabled": true,
"name": "{{.name}}",
"processGroups": [],
"queueEntryPoint": false,
"queueEntryPointType": null,
"rules": [
{
"annotations": [],
"className": "{{.className}}",
"enabled": true,
"fileName": "",
"matcher": "EQUALS",
"methodRules": [
{
"argumentTypes": [],
"methodName": "{{.methodName}}",
"returnType": "{{.returnType}}"
}
]
}
]
}

View File

@ -0,0 +1,13 @@
## Update dashboard configuration
- Configuration changes (like in dashboards, alerting profiles) must be done via a pull request. Changing a dashboard just in the environment, will cause that it will be overwritten by Monaco.
- How to generate changes in your dashboards?
1. Modify the dashboard within the Dynatrace UI with the intended changes.
2. Copy the JSON of the dashboards. (Can be found under the dashboard settings)
3. Paste the copied JSON under the Monaco JSON, overwrite it.
4. Commit and pull request to merge the branch to the master:
```
git add <changes>
git commit -m "<app_name> configuration changes"
git push -u origin <branch>
```

View File

@ -0,0 +1,127 @@
config:
- CDASBC-HAL-PROD: default.json
- CDASBC-HAL-E2E: default.json
- CDASBC-HAL-INT: default.json
- CDASBC-HAL-TEST: default.json
#PROD dashboards for EMEA/NA/CN Prod
#Dry-run needed for all hubs
CDASBC-HAL-PROD:
- name: CD_ASBC-HAL PROD
- mzName: CD_ASBC-HAL/management-zone/CDASBC-HAL.name
- mzId: CD_ASBC-HAL/management-zone/CDASBC-HAL.id
- env: PROD
- skipDeployment: "true"
#Configuration
CDASBC-HAL-PROD.EMEA-Prod:
- name: CD_ASBC-HAL PROD
- mzName: CD_ASBC-HAL/management-zone/CDASBC-HAL.name
- mzId: CD_ASBC-HAL/management-zone/CDASBC-HAL.id
- tag: ASBC-HAL
- env: PROD
- skipDeployment: "false"
CDASBC-HAL-PROD.NA-Prod:
- name: CD_ASBC-HAL PROD
- mzName: CD_ASBC-HAL/management-zone/CDASBC-HAL.name
- mzId: CD_ASBC-HAL/management-zone/CDASBC-HAL.id
- tag: ASBC-HAL
- env: PROD
- skipDeployment: "false"
CDASBC-HAL-PROD.CN-Prod:
- name: CD_ASBC-HAL PROD
- mzName: CD_ASBC-HAL/management-zone/CDASBC-HAL.name
- mzId: CD_ASBC-HAL/management-zone/CDASBC-HAL.id
- tag: ASBC-HAL
- env: PROD
- skipDeployment: "false"
#E2E dashboards for EMEA/NA/CN E2E
#Dry-run needed for all hubs
CDASBC-HAL-E2E:
- name: CD_ASBC-HAL E2E
- mzName: CD_ASBC-HAL/management-zone/CDASBC-HAL.name
- mzId: CD_ASBC-HAL/management-zone/CDASBC-HAL.id
- env: E2E
- skipDeployment: "true"
#Configuration
CDASBC-HAL-E2E.EMEA-Prod:
- name: CD_ASBC-HAL E2E
- mzName: CD_ASBC-HAL/management-zone/CDASBC-HAL.name
- mzId: CD_ASBC-HAL/management-zone/CDASBC-HAL.id
- env: E2E
- tag: ASBC-HAL
- skipDeployment: "true"
CDASBC-HAL-E2E.NA-Prod:
- name: CD_ASBC-HAL E2E
- mzName: CD_ASBC-HAL/management-zone/CDASBC-HAL.name
- mzId: CD_ASBC-HAL/management-zone/CDASBC-HAL.id
- env: E2E
- tag: ASBC-HAL
- skipDeployment: "true"
CDASBC-HAL-E2E.CN-Prod:
- name: CD_ASBC-HAL E2E
- mzName: CD_ASBC-HAL/management-zone/CDASBC-HAL.name
- mzId: CD_ASBC-HAL/management-zone/CDASBC-HAL.id
- env: E2E
- tag: ASBC-HAL
- skipDeployment: "true"
#INT dashboards for EMEA/NA/CN
#Dry-run needed for all hubs
CDASBC-HAL-INT:
- name: CD_ASBC-HAL INT
- mzName: CD_ASBC-HAL/management-zone/CDASBC-HAL.name
- mzId: CD_ASBC-HAL/management-zone/CDASBC-HAL.id
- env: INT
- tag: ASBC-HAL
- skipDeployment: "true"
#Configuration
CDASBC-HAL-INT.EMEA-PreProd:
- name: CD_ASBC-HAL INT
- mzName: CD_ASBC-HAL/management-zone/CDASBC-HAL.name
- mzId: CD_ASBC-HAL/management-zone/CDASBC-HAL.id
- env: INT
- tag: ASBC-HAL
- skipDeployment: "false"
CDASBC-HAL-INT.NA-PreProd:
- name: CD_ASBC-HAL INT
- mzName: CD_ASBC-HAL/management-zone/CDASBC-HAL.name
- mzId: CD_ASBC-HAL/management-zone/CDASBC-HAL.id
- env: INT
- skipDeployment: "false"
CDASBC-HAL-INT.CN-PreProd:
- name: CD_ASBC-HAL INT
- mzName: CD_ASBC-HAL/management-zone/CDASBC-HAL.name
- mzId: CD_ASBC-HAL/management-zone/CDASBC-HAL.id
- env: INT
- skipDeployment: "false"
#TEST dashboards for EMEA/NA/CN
#Dry-run needed for all hubs
CDASBC-HAL-TEST:
- name: CD_ASBC-HAL TEST
- mzName: CD_ASBC-HAL/management-zone/CDASBC-HAL.name
- mzId: CD_ASBC-HAL/management-zone/CDASBC-HAL.id
- tag: ASBC-HAL
- env: TEST
- skipDeployment: "true"
#Configuration
CDASBC-HAL-TEST.EMEA-PreProd:
- name: CD_ASBC-HAL TEST
- mzName: CD_ASBC-HAL/management-zone/CDASBC-HAL.name
- mzId: CD_ASBC-HAL/management-zone/CDASBC-HAL.id
- tag: ASBC-HAL
- env: TEST
- skipDeployment: "false"
CDASBC-HAL-TEST.NA-PreProd:
- name: CD_ASBC-HAL TEST
- mzName: CD_ASBC-HAL/management-zone/CDASBC-HAL.name
- mzId: CD_ASBC-HAL/management-zone/CDASBC-HAL.id
- env: TEST
- skipDeployment: "false"
CDASBC-HAL-TEST.CN-PreProd:
- name: CD_ASBC-HAL TEST
- mzName: CD_ASBC-HAL/management-zone/CDASBC-HAL.name
- mzId: CD_ASBC-HAL/management-zone/CDASBC-HAL.id
- env: TEST
- skipDeployment: "false"

View File

@ -0,0 +1,308 @@
{
"metadata": {
"configurationVersions": [
3
],
"clusterVersion": "1.214.107.20210407-223952"
},
"dashboardMetadata": {
"name": "{{.name}}",
"shared": true,
"owner": "Ignacio.Goldman@partner.bmwgroup.com",
"dashboardFilter": {
"timeframe": "-24h to now"
},
"tags": [
"{{.tag}}"
]
},
"tiles": [
{
"name": "Custom chart",
"tileType": "CUSTOM_CHARTING",
"configured": true,
"bounds": {
"top": 228,
"left": 38,
"width": 1064,
"height": 304
},
"tileFilter": {},
"filterConfig": {
"type": "MIXED",
"customName": "Failure rate (HTTP 4xx/5xx errors)",
"defaultName": "Custom chart",
"chartConfig": {
"legendShown": true,
"type": "TIMESERIES",
"series": [
{
"metric": "builtin:service.errors.fourxx.rate",
"aggregation": "AVG",
"type": "BAR",
"entityType": "SERVICE",
"dimensions": [],
"sortAscending": false,
"sortColumn": false,
"aggregationRate": "TOTAL"
},
{
"metric": "builtin:service.errors.fivexx.rate",
"aggregation": "AVG",
"type": "BAR",
"entityType": "SERVICE",
"dimensions": [],
"sortAscending": false,
"sortColumn": true,
"aggregationRate": "TOTAL"
}
],
"resultMetadata": {
"nullbuiltin:service.errors.fivexx.rate|AVG|TOTAL|BAR|SERVICE": {
"lastModified": 1617956393463,
"customColor": "#ff0000"
},
"nullbuiltin:service.errors.fourxx.rate|AVG|TOTAL|BAR|SERVICE": {
"lastModified": 1617956441725,
"customColor": "#fff29a"
}
}
},
"filtersPerEntityType": {
"SERVICE": {
"AUTO_TAGS": [
"Environment:{{.env}}",
"Component:{{.tag}}"
]
}
}
}
},
{
"name": "Problems",
"tileType": "OPEN_PROBLEMS",
"configured": true,
"bounds": {
"top": 38,
"left": 950,
"width": 152,
"height": 152
},
"tileFilter": {
"managementZone": {
"id": "{{.mzId}}",
"name": "{{.mzName}}"
}
}
},
{
"name": "Overall Health",
"tileType": "HEADER",
"configured": true,
"bounds": {
"top": 0,
"left": 38,
"width": 1064,
"height": 38
},
"tileFilter": {}
},
{
"name": "Markdown",
"tileType": "MARKDOWN",
"configured": true,
"bounds": {
"top": 532,
"left": 38,
"width": 1064,
"height": 38
},
"tileFilter": {},
"markdown": "---\n"
},
{
"name": "Custom chart",
"tileType": "CUSTOM_CHARTING",
"configured": true,
"bounds": {
"top": 570,
"left": 38,
"width": 1064,
"height": 304
},
"tileFilter": {},
"filterConfig": {
"type": "MIXED",
"customName": "Response time, Request Count and Number of Errors",
"defaultName": "Custom chart",
"chartConfig": {
"legendShown": true,
"type": "TIMESERIES",
"series": [
{
"metric": "builtin:service.response.time",
"aggregation": "AVG",
"type": "LINE",
"entityType": "SERVICE",
"dimensions": [],
"sortAscending": false,
"sortColumn": false,
"aggregationRate": "TOTAL"
},
{
"metric": "builtin:service.requestCount.total",
"aggregation": "NONE",
"type": "BAR",
"entityType": "SERVICE",
"dimensions": [],
"sortAscending": false,
"sortColumn": false,
"aggregationRate": "TOTAL"
},
{
"metric": "builtin:service.errors.total.count",
"aggregation": "NONE",
"type": "BAR",
"entityType": "SERVICE",
"dimensions": [],
"sortAscending": false,
"sortColumn": true,
"aggregationRate": "TOTAL"
}
],
"resultMetadata": {
"nullbuiltin:service.requestCount.total|NONE|TOTAL|BAR|SERVICE": {
"lastModified": 1595275720776,
"customColor": "#008cdb"
},
"nullbuiltin:service.errors.total.count|NONE|TOTAL|BAR|SERVICE": {
"lastModified": 1595275955999,
"customColor": "#ef651f"
},
"nullbuiltin:service.response.time|AVG|TOTAL|LINE|SERVICE": {
"lastModified": 1595275686773,
"customColor": "#b4e5f9"
}
}
},
"filtersPerEntityType": {
"SERVICE": {
"AUTO_TAGS": [
"Environment:{{.env}}",
"Component:{{.tag}}"
]
}
}
}
},
{
"name": "Markdown",
"tileType": "MARKDOWN",
"configured": true,
"bounds": {
"top": 190,
"left": 38,
"width": 1064,
"height": 38
},
"tileFilter": {},
"markdown": "---\n"
},
{
"name": "",
"tileType": "DATABASES_OVERVIEW",
"configured": true,
"bounds": {
"top": 38,
"left": 646,
"width": 190,
"height": 152
},
"tileFilter": {},
"filterConfig": {
"type": "DATABASE",
"customName": "Databases",
"defaultName": "Databases",
"chartConfig": {
"legendShown": true,
"type": "TIMESERIES",
"series": [],
"resultMetadata": {}
},
"filtersPerEntityType": {
"DATABASE": {
"AUTO_TAGS": [
"Environment:{{.env}}",
"Component:{{.tag}}"
]
}
}
},
"chartVisible": true
},
{
"name": "",
"tileType": "SERVICES",
"configured": true,
"bounds": {
"top": 38,
"left": 342,
"width": 190,
"height": 152
},
"tileFilter": {},
"filterConfig": {
"type": "SERVICE",
"customName": "Services",
"defaultName": "Services",
"chartConfig": {
"legendShown": true,
"type": "TIMESERIES",
"series": [],
"resultMetadata": {}
},
"filtersPerEntityType": {
"SERVICE": {
"AUTO_TAGS": [
"Environment:{{.env}}",
"Component:{{.tag}}"
]
}
}
},
"chartVisible": true
},
{
"name": "",
"tileType": "HOSTS",
"configured": true,
"bounds": {
"top": 38,
"left": 38,
"width": 190,
"height": 152
},
"tileFilter": {},
"filterConfig": {
"type": "HOST",
"customName": "Hosts",
"defaultName": "Hosts",
"chartConfig": {
"legendShown": true,
"type": "TIMESERIES",
"series": [],
"resultMetadata": {}
},
"filtersPerEntityType": {
"HOST": {
"AUTO_TAGS": [
"Environment:{{.env}}",
"Component:{{.tag}}"
]
}
}
},
"chartVisible": true
}
]
}

View File

@ -0,0 +1,60 @@
## Configure Notification System
### MS Teams - Default
*Let's suppose you would like to start receiving alerts from Dynatrace via MS Teams just for your *EMEA PROD*.*
1. Open *notification.yaml* under your application configuration folder. By default, all notification systems are configured via MS Teams with an
https://empty webhook (not configured).
2. Create an incoming webhook in MS Teams. [How to?](https://www.dynatrace.com/support/help/shortlink/set-up-msteams-integration#configuration-in-microsoft-teams)
3. Add the incoming webhook under the webhook parameter for the `<app_name>-PROD.EMEA-Prod`:
```
<app_name>-PROD.EMEA-Prod:
- name: CD_<app_name> PROD
- alertingProfile: CD_<app_name>/alerting-profile/CD<app_name>-PROD.id
- webhook: <Add webhook here>
- skipDeployment: "false"
```
4. Save and commit changes:
```
git add <changes>
git commit -m "<app_name> configuration changes"
git push -u origin <branch>
```
Note: If you want to enable MS Teams for any other hub/stage, follow the same steps but make sure you're under the right configuration:
`<app_name>-<stage>.<dynatrace-env>-<stage>:`
### Email
*The team prefers to be alerted via email, not MS Teams*
1. Keep the MS Teams integration disabled, with the https://empty webhook:
```
<app_name>-PROD.EMEA-Prod:
- name: CD_<app_name> PROD
- alertingProfile: CD_<app_name>/alerting-profile/CD<app_name>-PROD.id
- webhook: https://empty
- skipDeployment: "false"
```
2. Create a new configuration template under config, using the email template:
```
config:
- CD<app_name>email: email.json
```
3. Describe the configuration below, using the following template:
```
CD<app_name>email.EMEA-Prod:
- name: CD_<app_name> PROD
- alertingProfile: CD_<app_name>/alerting-profile/CD<app_name>-PROD.id
- receivers: distributionEmailexample@bmw.de`
```
4. Save and commit changes:
```
git add <changes>
git commit -m "<app_name> configuration changes"
git push -u origin <branch>
```
### ITSM
Coming soon!

View File

@ -0,0 +1,13 @@
{
"active": true,
"alertingProfile": "{{.alertingProfile}}",
"bccReceivers": [],
"body": "{ProblemDetailsHTML}",
"ccReceivers": [],
"name": "{{.name}}",
"receivers": [
"{{.receivers}}"
],
"subject": "{State} Problem {ProblemID}: {ImpactedEntity}",
"type": "EMAIL"
}

View File

@ -1,11 +1,11 @@
{ {
"acceptAnyCertificate": false, "acceptAnyCertificate": false,
"active": true, "active": true,
"alertingProfile": "{{.apid}}", "alertingProfile": "{{.alertingProfile}}",
"headers": [], "headers": [],
"name": "{{.name}}", "name": "{{.name}}",
"notifyEventMergesEnabled": false, "notifyEventMergesEnabled": false,
"payload": "{\n\"title\":\"{ProblemTitle}\",\n\"text\":\"{ProblemDetailsHTML}\",\n\"themeColor\":\"EA4300\"\n}", "payload": "{\n\"title\":\"{ProblemTitle}\",\n\"text\":\"{ProblemDetailsHTML}\",\n\"themeColor\":\"EA4300\"\n}",
"type": "WEBHOOK", "type": "WEBHOOK",
"url": "https://msggroup.webhook.office.com/webhookb2/empty" "url": "{{.webhook}}"
} }

View File

@ -0,0 +1,51 @@
config:
- CDASBC-HAL-PROD: msTeams.json
- CDASBC-HAL-INT: msTeams.json
#Prod notification system for EMEA/NA/CN
#Dry-run needed for all hubs
CDASBC-HAL-PROD:
- name: CD_ASBC-HAL PROD
- alertingProfile: CD_ASBC-HAL/alerting-profile/CDASBC-HAL-PROD.id
- webhook: https://empty
- skipDeployment: "true"
#Configuration
CDASBC-HAL-PROD.EMEA-Prod:
- name: CD_ASBC-HAL PROD
- alertingProfile: CD_ASBC-HAL/alerting-profile/CDASBC-HAL-PROD.id
- webhook: https://empty
- skipDeployment: "false"
CDASBC-HAL-PROD.NA-Prod:
- name: CD_ASBC-HAL PROD
- alertingProfile: CD_ASBC-HAL/alerting-profile/CDASBC-HAL-PROD.id
- webhook: https://empty
- skipDeployment: "false"
CDASBC-HAL-PROD.CN-Prod:
- name: CD_ASBC-HAL PROD
- alertingProfile: CD_ASBC-HAL/alerting-profile/CDASBC-HAL-PROD.id
- webhook: https://empty
- skipDeployment: "false"
#INT notification system for EMEA/NA/CN
#Dry-run needed for all hubs
CDASBC-HAL-INT:
- name: CD_ASBC-HAL INT
- alertingProfile: CD_ASBC-HAL/alerting-profile/CDASBC-HAL-INT.id
- webhook: https://empty
- skipDeployment: "true"
#Configuration
CDASBC-HAL-INT.EMEA-PreProd:
- name: CD_ASBC-HAL INT
- alertingProfile: CD_ASBC-HAL/alerting-profile/CDASBC-HAL-INT.id
- webhook: https://empty
- skipDeployment: "false"
CDASBC-HAL-INT.NA-PreProd:
- name: CD_ASBC-HAL INT
- alertingProfile: CD_ASBC-HAL/alerting-profile/CDASBC-HAL-INT.id
- webhook: https://empty
- skipDeployment: "false"
CDASBC-HAL-INT.CN-PreProd:
- name: CD_ASBC-HAL INT
- alertingProfile: CD_ASBC-HAL/alerting-profile/CDASBC-HAL-INT.id
- webhook: https://empty
- skipDeployment: "false"

View File

@ -0,0 +1,4 @@
### How to configure synthetics?
Please refer to [this](https://atc.bmwgroup.net/confluence/display/OPMAAS/Documentation+%7C+Synthetic+Monitors) page to configure your synthetics.

View File

@ -0,0 +1,82 @@
{
"anomalyDetection": {
"loadingTimeThresholds": {
"enabled": false,
"thresholds": [
{
"type": "TOTAL",
"valueMs": 0
}
]
},
"outageHandling": {
"globalOutage": true,
"localOutage": false,
"localOutagePolicy": {
"affectedLocations": 1,
"consecutiveRuns": 3
}
}
},
"automaticallyAssignedApps": [],
"enabled": true,
"frequencyMin": 1,
"locations": [
"{{.location}}"
],
"managementZones": [
{
"id": "{{.mzId}}",
"name": "{{.mzName}}"
}
],
"manuallyAssignedApps": [],
"name": "{{.name}}",
"requests": [
{
"entityId": "HTTP_CHECK_STEP-0BA53EC80CD7EE5A",
"name": "{{.name}}",
"sequenceNumber": 1
}
],
"script": {
"requests": [
{
"configuration": {
"acceptAnyCertificate": true,
"followRedirects": true,
"requestHeaders": [
{
"name": "accept",
"value": "application/json"
},
{
"name": "Content-Type",
"value": "application/json"
},
{
"name": "api_key",
"value": "355DE89C-7B72-4EA3-BDD8-157C79EB2C23"
}
]
},
"description": "{{.name}}",
"method": "GET",
"url": "{{.endpoint}}",
"validation": {
"rules": [
{
"passIfFound": true,
"type": "httpStatusesList",
"value": "200"
}
],
"rulesChaining": "or"
}
}
],
"version": "1.0"
},
"tags": [],
"type": "HTTP"
}

View File

@ -0,0 +1,10 @@
config:
- ASBC-HAL: default.json
ASBC-HAL:
- name: CD_ASBC-HAL - <synthetic-name>
- mzName: CD_ASBC-HAL/management-zone/CDASBC-HAL.name
- mzId: CD_ASBC-HAL/management-zone/CDASBC-HAL.id
- endpoint: <url>
- location: <location>
- skipDeployment: "true"

View File

@ -0,0 +1,10 @@
## Custom metrics - Multidimensional Analysis
Under the Multidimensional Analysis you're able to save a view but not to create a metric. Instead, you can do it in here:
1. Create the metric within the Dynatrace UI using the Mutidimensional Analysis view.
2. Save the view and create a ticket for the OPAPM team [here](link). Please provide the following information:
- View created in the Dynatrace UI
- Your Dynatrace configuration folder (i.e. CD_<app_name>)
The OPAPM team will proceed creating the metric and updating your configuration in monaco.

View File

@ -0,0 +1,67 @@
### Process Group Detection Rules and Naming
#### Detection Rule or Naming?
For the explanation, we're using a real example of the Infotainment application:
!(PGNaming1)[../../../../img/PGNaming1.PNG]
Before working with your dashboards and alerting profiles, an important task to do when working with Dynatrace is checking
the structure of your applications (process groups). You can do that clicking under *technologies* and filter using your
application Management Zone.
In the picture above, there are two Process Groups called bon-information-prod. **If you see duplicated process groups like in**
**this case, you MUST follow this guideline**
Next step would be to open both process groups and compare the metadata. In that way, you can identify if all process instances are
part of the same application or not. An easy way to do that is asking yourself: how many instances of my application do i have?
If you have 4 instances in total and you're able to see 2 in one PG and other 2 in other PG it means that **they are part of the **
**same application**
Another situation could be that checking on the metadata, then you see that are **two different application** and Dynatrace is just naming
the process group in the same way
*Same application*
- Problem: Dynatrace is creating two different process groups, what transalates in two separated services for the same application. Instead of
seeing all the traffic in one service, you will have it splitted and it will complicate your monitoring
- Solution: create a process group detection rule. Contact Dynatrace Expert
*Different application*
- Problem: Dynatrace is just naming in the same way applications that are different.
- Solution: This case is less severe, since it can be fixed with a process group naming rule.
What about our example?
!(PGNaming2)[../../../../img/PGNaming2.PNG]
!(PGNaming3)[../../../../img/PGNaming3.PNG]
Based on the feedback of the infotaiment team, each process group is a different application (microservice) and it's visible in the kubernetes container/workload
within the metadata of each Process Group.
#### How to create a Process Group Detection Rule
1. Open the *conditional-naming-processgroup.yaml* file and create a rule that looks like this:
```
config:
- CDInfotainmentRule1: template.json
CDInfotainmentRule1:
- name: Infotainment Rule 1
- nameFormat: {ProcessGroup:KubernetesNamespace} - {ProcessGroup:KubernetesContainerName}
- tag: Infotainment
- skipDeployment: false
```
The result of the rule will be renaming the PG to this:
```
bon-information-prod ipa
bon-information-prod rsl
```
Other possible placeholders that you can use are for example:
{ProcessGroup:KubernetesNamespace} - {ProcessGroup:KubernetesContainerName/[^\\-]*$}
{ProcessGroup:KubernetesNamespace} - {ProcessGroup:KubernetesFullPodName/buffet-(.*?)-}
{ProcessGroup:DetectedName} - {HostGroup:Name/[^\\_]*$}
{ProcessGroup:KubernetesNamespace}
{ProcessGroup:CommandLineArgs/.*?\\-f\\s\\/www\\/(.*?)\\/generated\\/httpd\\.conf.*?}
You can combine different ones. Check the (documentation)[link] for more

View File

@ -0,0 +1,8 @@
config:
- CDASBC-RSU: template.json
CDASBC-RSU:
- name: MyProcessNamingRule
- nameFormat: "{ProcessGroup:KubernetesNamespace/regex-example}"
- tag: ASBC-RSU
- skipDeployment: "true"

View File

@ -0,0 +1,29 @@
{
"displayName": "{{.name}}",
"enabled": true,
"metadata": {
"clusterVersion": "1.214.107.20210407-223952",
"configurationVersions": [
0
]
},
"nameFormat": "{{.nameFormat}}",
"rules": [
{
"comparisonInfo": {
"negate": false,
"operator": "EQUALS",
"type": "TAG",
"value": {
"context": "CONTEXTLESS",
"key": "Component",
"value": "{{.tag}}"
}
},
"key": {
"attribute": "PROCESS_GROUP_TAGS"
}
}
],
"type": "PROCESS_GROUP"
}

View File

@ -0,0 +1,35 @@
### Service Naming Rules
A typical case could be that you access to *Transaction & Services* and you find two services that are exactly the same:
*DataDownloadV1*
*DataDownloadV1*
If you drilldown into the service and you check in the process group, you may have a PROD and a E2E for each service.
*Note: if you see that both process group are exactly the same, please contact a Dynatrace expert to create a Process*
*Group detection rule*
In the case the PG are PROD and E2E, then we need to create a rule that looks like this:
```
config:
- CDInfotainmentRule1: template.json
CDInfotainmentRule1:
- name: Infotainment Rule 1
- nameFormat: {Service:DetectedName} - {ProcessGroup:KubernetesNamespace/[^-]+$}
- tag: Infotainment
- skipDeployment: false
```
The rule will get the Service Detected Name (current name) and it will extract (with a regex) the part of the kubernetes namespace after the "-", so -prod or -e2e, resulting in:
*DataDownloadV1 - prod*
*DataDownloadV1 - e2e*
Now, services will be easy to identify.
You can create rules based on any property/metadata. Some other placeholder's eamples:
{Service:DatabaseName} - E2E
{Service:WebServiceName} - {ProcessGroup:Kubernetes:microservice} - {ProcessGroup:Kubernetes:environment}
{Service:DetectedName} - {ProcessGroup:KubernetesContainerName} - {ProcessGroup:KubernetesNamespace/[^-]+$}
{Service:DetectedName} - {ProcessGroup:SpringBootProfileName/[^\\-]*$}

View File

@ -0,0 +1,8 @@
config:
- CDASBC-RSU: template.json
CDASBC-RSU:
- name: MyProcessNamingRule
- nameFormat: "{ProcessGroup:KubernetesNamespace/regex-example}"
- tag: ASBC-RSU
- skipDeployment: "true"

View File

@ -0,0 +1,29 @@
{
"displayName": "{{.name}}",
"enabled": true,
"metadata": {
"clusterVersion": "1.214.107.20210407-223952",
"configurationVersions": [
0
]
},
"nameFormat": "{{.nameFormat}}",
"rules": [
{
"comparisonInfo": {
"negate": false,
"operator": "EQUALS",
"type": "TAG",
"value": {
"context": "CONTEXTLESS",
"key": "Component",
"value": "{{.tag}}"
}
},
"key": {
"attribute": "SERVICE_TAGS"
}
}
],
"type": "SERVICE"
}

View File

@ -0,0 +1,4 @@
### How to configure custom services?
Please refer to [this](https://atc.bmwgroup.net/confluence/display/OPMAAS/Documentation+%7C+Custom+Services) page to configure your custom services.

View File

@ -0,0 +1,9 @@
config:
- customService1: template-1-1.json
customService1:
- name: myJOYNRService
- className: com.bmw.cc.conn.this.is.just.an.exampleClasss
- methodName: exampleJoynrMethod
- returnType: void
- skipDeployment: "true"

View File

@ -0,0 +1,23 @@
{
"enabled": true,
"name": "{{.name}}",
"processGroups": [],
"queueEntryPoint": false,
"queueEntryPointType": null,
"rules": [
{
"annotations": [],
"className": "{{.className}}",
"enabled": true,
"fileName": "",
"matcher": "EQUALS",
"methodRules": [
{
"argumentTypes": [],
"methodName": "{{.methodName}}",
"returnType": "{{.returnType}}"
}
]
}
]
}

View File

@ -0,0 +1,13 @@
## Update dashboard configuration
- Configuration changes (like in dashboards, alerting profiles) must be done via a pull request. Changing a dashboard just in the environment, will cause that it will be overwritten by Monaco.
- How to generate changes in your dashboards?
1. Modify the dashboard within the Dynatrace UI with the intended changes.
2. Copy the JSON of the dashboards. (Can be found under the dashboard settings)
3. Paste the copied JSON under the Monaco JSON, overwrite it.
4. Commit and pull request to merge the branch to the master:
```
git add <changes>
git commit -m "<app_name> configuration changes"
git push -u origin <branch>
```

View File

@ -0,0 +1,127 @@
config:
- CDASBC-RSU-PROD: default.json
- CDASBC-RSU-E2E: default.json
- CDASBC-RSU-INT: default.json
- CDASBC-RSU-TEST: default.json
#PROD dashboards for EMEA/NA/CN Prod
#Dry-run needed for all hubs
CDASBC-RSU-PROD:
- name: CD_ASBC-RSU PROD
- mzName: CD_ASBC-RSU/management-zone/CDASBC-RSU.name
- mzId: CD_ASBC-RSU/management-zone/CDASBC-RSU.id
- env: PROD
- skipDeployment: "true"
#Configuration
CDASBC-RSU-PROD.EMEA-Prod:
- name: CD_ASBC-RSU PROD
- mzName: CD_ASBC-RSU/management-zone/CDASBC-RSU.name
- mzId: CD_ASBC-RSU/management-zone/CDASBC-RSU.id
- tag: ASBC-RSU
- env: PROD
- skipDeployment: "false"
CDASBC-RSU-PROD.NA-Prod:
- name: CD_ASBC-RSU PROD
- mzName: CD_ASBC-RSU/management-zone/CDASBC-RSU.name
- mzId: CD_ASBC-RSU/management-zone/CDASBC-RSU.id
- tag: ASBC-RSU
- env: PROD
- skipDeployment: "false"
CDASBC-RSU-PROD.CN-Prod:
- name: CD_ASBC-RSU PROD
- mzName: CD_ASBC-RSU/management-zone/CDASBC-RSU.name
- mzId: CD_ASBC-RSU/management-zone/CDASBC-RSU.id
- tag: ASBC-RSU
- env: PROD
- skipDeployment: "false"
#E2E dashboards for EMEA/NA/CN E2E
#Dry-run needed for all hubs
CDASBC-RSU-E2E:
- name: CD_ASBC-RSU E2E
- mzName: CD_ASBC-RSU/management-zone/CDASBC-RSU.name
- mzId: CD_ASBC-RSU/management-zone/CDASBC-RSU.id
- env: E2E
- skipDeployment: "true"
#Configuration
CDASBC-RSU-E2E.EMEA-Prod:
- name: CD_ASBC-RSU E2E
- mzName: CD_ASBC-RSU/management-zone/CDASBC-RSU.name
- mzId: CD_ASBC-RSU/management-zone/CDASBC-RSU.id
- env: E2E
- tag: ASBC-RSU
- skipDeployment: "true"
CDASBC-RSU-E2E.NA-Prod:
- name: CD_ASBC-RSU E2E
- mzName: CD_ASBC-RSU/management-zone/CDASBC-RSU.name
- mzId: CD_ASBC-RSU/management-zone/CDASBC-RSU.id
- env: E2E
- tag: ASBC-RSU
- skipDeployment: "true"
CDASBC-RSU-E2E.CN-Prod:
- name: CD_ASBC-RSU E2E
- mzName: CD_ASBC-RSU/management-zone/CDASBC-RSU.name
- mzId: CD_ASBC-RSU/management-zone/CDASBC-RSU.id
- env: E2E
- tag: ASBC-RSU
- skipDeployment: "true"
#INT dashboards for EMEA/NA/CN
#Dry-run needed for all hubs
CDASBC-RSU-INT:
- name: CD_ASBC-RSU INT
- mzName: CD_ASBC-RSU/management-zone/CDASBC-RSU.name
- mzId: CD_ASBC-RSU/management-zone/CDASBC-RSU.id
- env: INT
- tag: ASBC-RSU
- skipDeployment: "true"
#Configuration
CDASBC-RSU-INT.EMEA-PreProd:
- name: CD_ASBC-RSU INT
- mzName: CD_ASBC-RSU/management-zone/CDASBC-RSU.name
- mzId: CD_ASBC-RSU/management-zone/CDASBC-RSU.id
- env: INT
- tag: ASBC-RSU
- skipDeployment: "false"
CDASBC-RSU-INT.NA-PreProd:
- name: CD_ASBC-RSU INT
- mzName: CD_ASBC-RSU/management-zone/CDASBC-RSU.name
- mzId: CD_ASBC-RSU/management-zone/CDASBC-RSU.id
- env: INT
- skipDeployment: "false"
CDASBC-RSU-INT.CN-PreProd:
- name: CD_ASBC-RSU INT
- mzName: CD_ASBC-RSU/management-zone/CDASBC-RSU.name
- mzId: CD_ASBC-RSU/management-zone/CDASBC-RSU.id
- env: INT
- skipDeployment: "false"
#TEST dashboards for EMEA/NA/CN
#Dry-run needed for all hubs
CDASBC-RSU-TEST:
- name: CD_ASBC-RSU TEST
- mzName: CD_ASBC-RSU/management-zone/CDASBC-RSU.name
- mzId: CD_ASBC-RSU/management-zone/CDASBC-RSU.id
- tag: ASBC-RSU
- env: TEST
- skipDeployment: "true"
#Configuration
CDASBC-RSU-TEST.EMEA-PreProd:
- name: CD_ASBC-RSU TEST
- mzName: CD_ASBC-RSU/management-zone/CDASBC-RSU.name
- mzId: CD_ASBC-RSU/management-zone/CDASBC-RSU.id
- tag: ASBC-RSU
- env: TEST
- skipDeployment: "false"
CDASBC-RSU-TEST.NA-PreProd:
- name: CD_ASBC-RSU TEST
- mzName: CD_ASBC-RSU/management-zone/CDASBC-RSU.name
- mzId: CD_ASBC-RSU/management-zone/CDASBC-RSU.id
- env: TEST
- skipDeployment: "false"
CDASBC-RSU-TEST.CN-PreProd:
- name: CD_ASBC-RSU TEST
- mzName: CD_ASBC-RSU/management-zone/CDASBC-RSU.name
- mzId: CD_ASBC-RSU/management-zone/CDASBC-RSU.id
- env: TEST
- skipDeployment: "false"

View File

@ -0,0 +1,308 @@
{
"metadata": {
"configurationVersions": [
3
],
"clusterVersion": "1.214.107.20210407-223952"
},
"dashboardMetadata": {
"name": "{{.name}}",
"shared": true,
"owner": "Ignacio.Goldman@partner.bmwgroup.com",
"dashboardFilter": {
"timeframe": "-24h to now"
},
"tags": [
"{{.tag}}"
]
},
"tiles": [
{
"name": "Custom chart",
"tileType": "CUSTOM_CHARTING",
"configured": true,
"bounds": {
"top": 228,
"left": 38,
"width": 1064,
"height": 304
},
"tileFilter": {},
"filterConfig": {
"type": "MIXED",
"customName": "Failure rate (HTTP 4xx/5xx errors)",
"defaultName": "Custom chart",
"chartConfig": {
"legendShown": true,
"type": "TIMESERIES",
"series": [
{
"metric": "builtin:service.errors.fourxx.rate",
"aggregation": "AVG",
"type": "BAR",
"entityType": "SERVICE",
"dimensions": [],
"sortAscending": false,
"sortColumn": false,
"aggregationRate": "TOTAL"
},
{
"metric": "builtin:service.errors.fivexx.rate",
"aggregation": "AVG",
"type": "BAR",
"entityType": "SERVICE",
"dimensions": [],
"sortAscending": false,
"sortColumn": true,
"aggregationRate": "TOTAL"
}
],
"resultMetadata": {
"nullbuiltin:service.errors.fivexx.rate|AVG|TOTAL|BAR|SERVICE": {
"lastModified": 1617956393463,
"customColor": "#ff0000"
},
"nullbuiltin:service.errors.fourxx.rate|AVG|TOTAL|BAR|SERVICE": {
"lastModified": 1617956441725,
"customColor": "#fff29a"
}
}
},
"filtersPerEntityType": {
"SERVICE": {
"AUTO_TAGS": [
"Environment:{{.env}}",
"Component:{{.tag}}"
]
}
}
}
},
{
"name": "Problems",
"tileType": "OPEN_PROBLEMS",
"configured": true,
"bounds": {
"top": 38,
"left": 950,
"width": 152,
"height": 152
},
"tileFilter": {
"managementZone": {
"id": "{{.mzId}}",
"name": "{{.mzName}}"
}
}
},
{
"name": "Overall Health",
"tileType": "HEADER",
"configured": true,
"bounds": {
"top": 0,
"left": 38,
"width": 1064,
"height": 38
},
"tileFilter": {}
},
{
"name": "Markdown",
"tileType": "MARKDOWN",
"configured": true,
"bounds": {
"top": 532,
"left": 38,
"width": 1064,
"height": 38
},
"tileFilter": {},
"markdown": "---\n"
},
{
"name": "Custom chart",
"tileType": "CUSTOM_CHARTING",
"configured": true,
"bounds": {
"top": 570,
"left": 38,
"width": 1064,
"height": 304
},
"tileFilter": {},
"filterConfig": {
"type": "MIXED",
"customName": "Response time, Request Count and Number of Errors",
"defaultName": "Custom chart",
"chartConfig": {
"legendShown": true,
"type": "TIMESERIES",
"series": [
{
"metric": "builtin:service.response.time",
"aggregation": "AVG",
"type": "LINE",
"entityType": "SERVICE",
"dimensions": [],
"sortAscending": false,
"sortColumn": false,
"aggregationRate": "TOTAL"
},
{
"metric": "builtin:service.requestCount.total",
"aggregation": "NONE",
"type": "BAR",
"entityType": "SERVICE",
"dimensions": [],
"sortAscending": false,
"sortColumn": false,
"aggregationRate": "TOTAL"
},
{
"metric": "builtin:service.errors.total.count",
"aggregation": "NONE",
"type": "BAR",
"entityType": "SERVICE",
"dimensions": [],
"sortAscending": false,
"sortColumn": true,
"aggregationRate": "TOTAL"
}
],
"resultMetadata": {
"nullbuiltin:service.requestCount.total|NONE|TOTAL|BAR|SERVICE": {
"lastModified": 1595275720776,
"customColor": "#008cdb"
},
"nullbuiltin:service.errors.total.count|NONE|TOTAL|BAR|SERVICE": {
"lastModified": 1595275955999,
"customColor": "#ef651f"
},
"nullbuiltin:service.response.time|AVG|TOTAL|LINE|SERVICE": {
"lastModified": 1595275686773,
"customColor": "#b4e5f9"
}
}
},
"filtersPerEntityType": {
"SERVICE": {
"AUTO_TAGS": [
"Environment:{{.env}}",
"Component:{{.tag}}"
]
}
}
}
},
{
"name": "Markdown",
"tileType": "MARKDOWN",
"configured": true,
"bounds": {
"top": 190,
"left": 38,
"width": 1064,
"height": 38
},
"tileFilter": {},
"markdown": "---\n"
},
{
"name": "",
"tileType": "DATABASES_OVERVIEW",
"configured": true,
"bounds": {
"top": 38,
"left": 646,
"width": 190,
"height": 152
},
"tileFilter": {},
"filterConfig": {
"type": "DATABASE",
"customName": "Databases",
"defaultName": "Databases",
"chartConfig": {
"legendShown": true,
"type": "TIMESERIES",
"series": [],
"resultMetadata": {}
},
"filtersPerEntityType": {
"DATABASE": {
"AUTO_TAGS": [
"Environment:{{.env}}",
"Component:{{.tag}}"
]
}
}
},
"chartVisible": true
},
{
"name": "",
"tileType": "SERVICES",
"configured": true,
"bounds": {
"top": 38,
"left": 342,
"width": 190,
"height": 152
},
"tileFilter": {},
"filterConfig": {
"type": "SERVICE",
"customName": "Services",
"defaultName": "Services",
"chartConfig": {
"legendShown": true,
"type": "TIMESERIES",
"series": [],
"resultMetadata": {}
},
"filtersPerEntityType": {
"SERVICE": {
"AUTO_TAGS": [
"Environment:{{.env}}",
"Component:{{.tag}}"
]
}
}
},
"chartVisible": true
},
{
"name": "",
"tileType": "HOSTS",
"configured": true,
"bounds": {
"top": 38,
"left": 38,
"width": 190,
"height": 152
},
"tileFilter": {},
"filterConfig": {
"type": "HOST",
"customName": "Hosts",
"defaultName": "Hosts",
"chartConfig": {
"legendShown": true,
"type": "TIMESERIES",
"series": [],
"resultMetadata": {}
},
"filtersPerEntityType": {
"HOST": {
"AUTO_TAGS": [
"Environment:{{.env}}",
"Component:{{.tag}}"
]
}
}
},
"chartVisible": true
}
]
}

View File

@ -0,0 +1,4 @@
### How to configure synthetics?
Please refer to [this](https://atc.bmwgroup.net/confluence/display/OPMAAS/Documentation+%7C+Synthetic+Monitors) page to configure your synthetics.

View File

@ -0,0 +1,82 @@
{
"anomalyDetection": {
"loadingTimeThresholds": {
"enabled": false,
"thresholds": [
{
"type": "TOTAL",
"valueMs": 0
}
]
},
"outageHandling": {
"globalOutage": true,
"localOutage": false,
"localOutagePolicy": {
"affectedLocations": 1,
"consecutiveRuns": 3
}
}
},
"automaticallyAssignedApps": [],
"enabled": true,
"frequencyMin": 1,
"locations": [
"{{.location}}"
],
"managementZones": [
{
"id": "{{.mzId}}",
"name": "{{.mzName}}"
}
],
"manuallyAssignedApps": [],
"name": "{{.name}}",
"requests": [
{
"entityId": "HTTP_CHECK_STEP-0BA53EC80CD7EE5A",
"name": "{{.name}}",
"sequenceNumber": 1
}
],
"script": {
"requests": [
{
"configuration": {
"acceptAnyCertificate": true,
"followRedirects": true,
"requestHeaders": [
{
"name": "accept",
"value": "application/json"
},
{
"name": "Content-Type",
"value": "application/json"
},
{
"name": "api_key",
"value": "355DE89C-7B72-4EA3-BDD8-157C79EB2C23"
}
]
},
"description": "{{.name}}",
"method": "GET",
"url": "{{.endpoint}}",
"validation": {
"rules": [
{
"passIfFound": true,
"type": "httpStatusesList",
"value": "200"
}
],
"rulesChaining": "or"
}
}
],
"version": "1.0"
},
"tags": [],
"type": "HTTP"
}

View File

@ -0,0 +1,10 @@
config:
- ASBC-RSU: default.json
ASBC-RSU:
- name: CD_ASBC-RSU - <synthetic-name>
- mzName: CD_ASBC-RSU/management-zone/CDASBC-RSU.name
- mzId: CD_ASBC-RSU/management-zone/CDASBC-RSU.id
- endpoint: <url>
- location: <location>
- skipDeployment: "true"

View File

@ -1,4 +1,60 @@
config: config:
- CDASBC-SMACC: CDASBC-SMACC.json - CDASBC-SMACC-PROD: default.json
CDASBC-SMACC: - CDASBC-SMACC-INT: default.json
- name: CD_ASBC-SMACC
#Prod alerting profiles for EMEA/NA/CN
#Dry-run needed for all hubs
CDASBC-SMACC-PROD:
- name: CD_ASBC-SMACC PROD
- tag: ASBC-SMACC
- mzId: CD_ASBC-SMACC/management-zone/CDASBC-SMACC.id
- env: PROD
- skipDeployment: "true"
#Configuration
CDASBC-SMACC-PROD.EMEA-Prod:
- name: CD_ASBC-SMACC PROD
- tag: ASBC-SMACC
- mzId: CD_ASBC-SMACC/management-zone/CDASBC-SMACC.id
- env: PROD
- skipDeployment: "false"
CDASBC-SMACC-PROD.NA-Prod:
- name: CD_ASBC-SMACC PROD
- tag: ASBC-SMACC
- mzId: CD_ASBC-SMACC/management-zone/CDASBC-SMACC.id
- env: PROD
- skipDeployment: "false"
CDASBC-SMACC-PROD.CN-Prod:
- name: CD_ASBC-SMACC PROD
- tag: ASBC-SMACC
- mzId: CD_ASBC-SMACC/management-zone/CDASBC-SMACC.id
- env: PROD
- skipDeployment: "false"
#INT alerting profiles for EMEA/NA/CN
#Dry-run needed for all hubs
CDASBC-SMACC-INT:
- name: CD_ASBC-SMACC INT
- tag: ASBC-SMACC
- mzId: CD_ASBC-SMACC/management-zone/CDASBC-SMACC.id
- env: INT
- skipDeployment: "true"
#Configuration
CDASBC-SMACC-INT.EMEA-PreProd:
- name: CD_ASBC-SMACC INT
- tag: ASBC-SMACC
- mzId: CD_ASBC-SMACC/management-zone/CDASBC-SMACC.id
- env: INT
- skipDeployment: "false"
CDASBC-SMACC-INT.NA-PreProd:
- name: CD_ASBC-SMACC INT
- tag: ASBC-SMACC
- mzId: CD_ASBC-SMACC/management-zone/CDASBC-SMACC.id
- env: INT
- skipDeployment: "false"
CDASBC-SMACC-INT.CN-PreProd:
- name: CD_ASBC-SMACC INT
- tag: ASBC-SMACC
- mzId: CD_ASBC-SMACC/management-zone/CDASBC-SMACC.id
- env: INT
- skipDeployment: "false"

View File

@ -8,12 +8,17 @@
"delayInMinutes": 0, "delayInMinutes": 0,
"severityLevel": "AVAILABILITY", "severityLevel": "AVAILABILITY",
"tagFilter": { "tagFilter": {
"includeMode": "INCLUDE_ANY", "includeMode": "INCLUDE_ALL",
"tagFilters": [ "tagFilters": [
{ {
"context": "CONTEXTLESS", "context": "CONTEXTLESS",
"key": "Component", "key": "Component",
"value": "{{.tag}}" "value": "{{.tag}}"
},
{
"context": "CONTEXTLESS",
"key": "Environment",
"value": "{{.env}}"
} }
] ]
} }
@ -22,12 +27,17 @@
"delayInMinutes": 10, "delayInMinutes": 10,
"severityLevel": "ERROR", "severityLevel": "ERROR",
"tagFilter": { "tagFilter": {
"includeMode": "INCLUDE_ANY", "includeMode": "INCLUDE_ALL",
"tagFilters": [ "tagFilters": [
{ {
"context": "CONTEXTLESS", "context": "CONTEXTLESS",
"key": "Component", "key": "Component",
"value": "{{.tag}}" "value": "{{.tag}}"
},
{
"context": "CONTEXTLESS",
"key": "Environment",
"value": "{{.env}}"
} }
] ]
} }
@ -36,12 +46,17 @@
"delayInMinutes": 30, "delayInMinutes": 30,
"severityLevel": "PERFORMANCE", "severityLevel": "PERFORMANCE",
"tagFilter": { "tagFilter": {
"includeMode": "INCLUDE_ANY", "includeMode": "INCLUDE_ALL",
"tagFilters": [ "tagFilters": [
{ {
"context": "CONTEXTLESS", "context": "CONTEXTLESS",
"key": "Component", "key": "Component",
"value": "{{.tag}}" "value": "{{.tag}}"
},
{
"context": "CONTEXTLESS",
"key": "Environment",
"value": "{{.env}}"
} }
] ]
} }
@ -50,12 +65,17 @@
"delayInMinutes": 30, "delayInMinutes": 30,
"severityLevel": "RESOURCE_CONTENTION", "severityLevel": "RESOURCE_CONTENTION",
"tagFilter": { "tagFilter": {
"includeMode": "INCLUDE_ANY", "includeMode": "INCLUDE_ALL",
"tagFilters": [ "tagFilters": [
{ {
"context": "CONTEXTLESS", "context": "CONTEXTLESS",
"key": "Component", "key": "Component",
"value": "{{.tag}}" "value": "{{.tag}}"
},
{
"context": "CONTEXTLESS",
"key": "Environment",
"value": "{{.env}}"
} }
] ]
} }
@ -64,26 +84,17 @@
"delayInMinutes": 10, "delayInMinutes": 10,
"severityLevel": "CUSTOM_ALERT", "severityLevel": "CUSTOM_ALERT",
"tagFilter": { "tagFilter": {
"includeMode": "INCLUDE_ANY", "includeMode": "INCLUDE_ALL",
"tagFilters": [ "tagFilters": [
{ {
"context": "CONTEXTLESS", "context": "CONTEXTLESS",
"key": "Component", "key": "Component",
"value": "{{.tag}}" "value": "{{.tag}}"
} },
] {
}
},
{
"delayInMinutes": 0,
"severityLevel": "MONITORING_UNAVAILABLE",
"tagFilter": {
"includeMode": "INCLUDE_ANY",
"tagFilters": [
{
"context": "CONTEXTLESS", "context": "CONTEXTLESS",
"key": "Component", "key": "Environment",
"value": "{{.tag}}" "value": "{{.env}}"
} }
] ]
} }

View File

@ -0,0 +1,10 @@
## Custom metrics - Multidimensional Analysis
Under the Multidimensional Analysis you're able to save a view but not to create a metric. Instead, you can do it in here:
1. Create the metric within the Dynatrace UI using the Mutidimensional Analysis view.
2. Save the view and create a ticket for the OPAPM team [here](link). Please provide the following information:
- View created in the Dynatrace UI
- Your Dynatrace configuration folder (i.e. CD_<app_name>)
The OPAPM team will proceed creating the metric and updating your configuration in monaco.

View File

@ -0,0 +1,67 @@
### Process Group Detection Rules and Naming
#### Detection Rule or Naming?
For the explanation, we're using a real example of the Infotainment application:
!(PGNaming1)[../../../../img/PGNaming1.PNG]
Before working with your dashboards and alerting profiles, an important task to do when working with Dynatrace is checking
the structure of your applications (process groups). You can do that clicking under *technologies* and filter using your
application Management Zone.
In the picture above, there are two Process Groups called bon-information-prod. **If you see duplicated process groups like in**
**this case, you MUST follow this guideline**
Next step would be to open both process groups and compare the metadata. In that way, you can identify if all process instances are
part of the same application or not. An easy way to do that is asking yourself: how many instances of my application do i have?
If you have 4 instances in total and you're able to see 2 in one PG and other 2 in other PG it means that **they are part of the **
**same application**
Another situation could be that checking on the metadata, then you see that are **two different application** and Dynatrace is just naming
the process group in the same way
*Same application*
- Problem: Dynatrace is creating two different process groups, what transalates in two separated services for the same application. Instead of
seeing all the traffic in one service, you will have it splitted and it will complicate your monitoring
- Solution: create a process group detection rule. Contact Dynatrace Expert
*Different application*
- Problem: Dynatrace is just naming in the same way applications that are different.
- Solution: This case is less severe, since it can be fixed with a process group naming rule.
What about our example?
!(PGNaming2)[../../../../img/PGNaming2.PNG]
!(PGNaming3)[../../../../img/PGNaming3.PNG]
Based on the feedback of the infotaiment team, each process group is a different application (microservice) and it's visible in the kubernetes container/workload
within the metadata of each Process Group.
#### How to create a Process Group Detection Rule
1. Open the *conditional-naming-processgroup.yaml* file and create a rule that looks like this:
```
config:
- CDInfotainmentRule1: template.json
CDInfotainmentRule1:
- name: Infotainment Rule 1
- nameFormat: {ProcessGroup:KubernetesNamespace} - {ProcessGroup:KubernetesContainerName}
- tag: Infotainment
- skipDeployment: false
```
The result of the rule will be renaming the PG to this:
```
bon-information-prod ipa
bon-information-prod rsl
```
Other possible placeholders that you can use are for example:
{ProcessGroup:KubernetesNamespace} - {ProcessGroup:KubernetesContainerName/[^\\-]*$}
{ProcessGroup:KubernetesNamespace} - {ProcessGroup:KubernetesFullPodName/buffet-(.*?)-}
{ProcessGroup:DetectedName} - {HostGroup:Name/[^\\_]*$}
{ProcessGroup:KubernetesNamespace}
{ProcessGroup:CommandLineArgs/.*?\\-f\\s\\/www\\/(.*?)\\/generated\\/httpd\\.conf.*?}
You can combine different ones. Check the (documentation)[link] for more

View File

@ -0,0 +1,8 @@
config:
- CDASBC-SMACC: template.json
CDASBC-SMACC:
- name: MyProcessNamingRule
- nameFormat: "{ProcessGroup:KubernetesNamespace/regex-example}"
- tag: ASBC-SMACC
- skipDeployment: "true"

View File

@ -0,0 +1,29 @@
{
"displayName": "{{.name}}",
"enabled": true,
"metadata": {
"clusterVersion": "1.214.107.20210407-223952",
"configurationVersions": [
0
]
},
"nameFormat": "{{.nameFormat}}",
"rules": [
{
"comparisonInfo": {
"negate": false,
"operator": "EQUALS",
"type": "TAG",
"value": {
"context": "CONTEXTLESS",
"key": "Component",
"value": "{{.tag}}"
}
},
"key": {
"attribute": "PROCESS_GROUP_TAGS"
}
}
],
"type": "PROCESS_GROUP"
}

View File

@ -0,0 +1,35 @@
### Service Naming Rules
A typical case could be that you access to *Transaction & Services* and you find two services that are exactly the same:
*DataDownloadV1*
*DataDownloadV1*
If you drilldown into the service and you check in the process group, you may have a PROD and a E2E for each service.
*Note: if you see that both process group are exactly the same, please contact a Dynatrace expert to create a Process*
*Group detection rule*
In the case the PG are PROD and E2E, then we need to create a rule that looks like this:
```
config:
- CDInfotainmentRule1: template.json
CDInfotainmentRule1:
- name: Infotainment Rule 1
- nameFormat: {Service:DetectedName} - {ProcessGroup:KubernetesNamespace/[^-]+$}
- tag: Infotainment
- skipDeployment: false
```
The rule will get the Service Detected Name (current name) and it will extract (with a regex) the part of the kubernetes namespace after the "-", so -prod or -e2e, resulting in:
*DataDownloadV1 - prod*
*DataDownloadV1 - e2e*
Now, services will be easy to identify.
You can create rules based on any property/metadata. Some other placeholder's eamples:
{Service:DatabaseName} - E2E
{Service:WebServiceName} - {ProcessGroup:Kubernetes:microservice} - {ProcessGroup:Kubernetes:environment}
{Service:DetectedName} - {ProcessGroup:KubernetesContainerName} - {ProcessGroup:KubernetesNamespace/[^-]+$}
{Service:DetectedName} - {ProcessGroup:SpringBootProfileName/[^\\-]*$}

View File

@ -0,0 +1,8 @@
config:
- CDASBC-SMACC: template.json
CDASBC-SMACC:
- name: MyProcessNamingRule
- nameFormat: "{ProcessGroup:KubernetesNamespace/regex-example}"
- tag: ASBC-SMACC
- skipDeployment: "true"

View File

@ -0,0 +1,29 @@
{
"displayName": "{{.name}}",
"enabled": true,
"metadata": {
"clusterVersion": "1.214.107.20210407-223952",
"configurationVersions": [
0
]
},
"nameFormat": "{{.nameFormat}}",
"rules": [
{
"comparisonInfo": {
"negate": false,
"operator": "EQUALS",
"type": "TAG",
"value": {
"context": "CONTEXTLESS",
"key": "Component",
"value": "{{.tag}}"
}
},
"key": {
"attribute": "SERVICE_TAGS"
}
}
],
"type": "SERVICE"
}

View File

@ -0,0 +1,4 @@
### How to configure custom services?
Please refer to [this](https://atc.bmwgroup.net/confluence/display/OPMAAS/Documentation+%7C+Custom+Services) page to configure your custom services.

View File

@ -0,0 +1,9 @@
config:
- customService1: template-1-1.json
customService1:
- name: myJOYNRService
- className: com.bmw.cc.conn.this.is.just.an.exampleClasss
- methodName: exampleJoynrMethod
- returnType: void
- skipDeployment: "true"

View File

@ -0,0 +1,23 @@
{
"enabled": true,
"name": "{{.name}}",
"processGroups": [],
"queueEntryPoint": false,
"queueEntryPointType": null,
"rules": [
{
"annotations": [],
"className": "{{.className}}",
"enabled": true,
"fileName": "",
"matcher": "EQUALS",
"methodRules": [
{
"argumentTypes": [],
"methodName": "{{.methodName}}",
"returnType": "{{.returnType}}"
}
]
}
]
}

View File

@ -0,0 +1,13 @@
## Update dashboard configuration
- Configuration changes (like in dashboards, alerting profiles) must be done via a pull request. Changing a dashboard just in the environment, will cause that it will be overwritten by Monaco.
- How to generate changes in your dashboards?
1. Modify the dashboard within the Dynatrace UI with the intended changes.
2. Copy the JSON of the dashboards. (Can be found under the dashboard settings)
3. Paste the copied JSON under the Monaco JSON, overwrite it.
4. Commit and pull request to merge the branch to the master:
```
git add <changes>
git commit -m "<app_name> configuration changes"
git push -u origin <branch>
```

View File

@ -0,0 +1,127 @@
config:
- CDASBC-SMACC-PROD: default.json
- CDASBC-SMACC-E2E: default.json
- CDASBC-SMACC-INT: default.json
- CDASBC-SMACC-TEST: default.json
#PROD dashboards for EMEA/NA/CN Prod
#Dry-run needed for all hubs
CDASBC-SMACC-PROD:
- name: CD_ASBC-SMACC PROD
- mzName: CD_ASBC-SMACC/management-zone/CDASBC-SMACC.name
- mzId: CD_ASBC-SMACC/management-zone/CDASBC-SMACC.id
- env: PROD
- skipDeployment: "true"
#Configuration
CDASBC-SMACC-PROD.EMEA-Prod:
- name: CD_ASBC-SMACC PROD
- mzName: CD_ASBC-SMACC/management-zone/CDASBC-SMACC.name
- mzId: CD_ASBC-SMACC/management-zone/CDASBC-SMACC.id
- tag: ASBC-SMACC
- env: PROD
- skipDeployment: "false"
CDASBC-SMACC-PROD.NA-Prod:
- name: CD_ASBC-SMACC PROD
- mzName: CD_ASBC-SMACC/management-zone/CDASBC-SMACC.name
- mzId: CD_ASBC-SMACC/management-zone/CDASBC-SMACC.id
- tag: ASBC-SMACC
- env: PROD
- skipDeployment: "false"
CDASBC-SMACC-PROD.CN-Prod:
- name: CD_ASBC-SMACC PROD
- mzName: CD_ASBC-SMACC/management-zone/CDASBC-SMACC.name
- mzId: CD_ASBC-SMACC/management-zone/CDASBC-SMACC.id
- tag: ASBC-SMACC
- env: PROD
- skipDeployment: "false"
#E2E dashboards for EMEA/NA/CN E2E
#Dry-run needed for all hubs
CDASBC-SMACC-E2E:
- name: CD_ASBC-SMACC E2E
- mzName: CD_ASBC-SMACC/management-zone/CDASBC-SMACC.name
- mzId: CD_ASBC-SMACC/management-zone/CDASBC-SMACC.id
- env: E2E
- skipDeployment: "true"
#Configuration
CDASBC-SMACC-E2E.EMEA-Prod:
- name: CD_ASBC-SMACC E2E
- mzName: CD_ASBC-SMACC/management-zone/CDASBC-SMACC.name
- mzId: CD_ASBC-SMACC/management-zone/CDASBC-SMACC.id
- env: E2E
- tag: ASBC-SMACC
- skipDeployment: "true"
CDASBC-SMACC-E2E.NA-Prod:
- name: CD_ASBC-SMACC E2E
- mzName: CD_ASBC-SMACC/management-zone/CDASBC-SMACC.name
- mzId: CD_ASBC-SMACC/management-zone/CDASBC-SMACC.id
- env: E2E
- tag: ASBC-SMACC
- skipDeployment: "true"
CDASBC-SMACC-E2E.CN-Prod:
- name: CD_ASBC-SMACC E2E
- mzName: CD_ASBC-SMACC/management-zone/CDASBC-SMACC.name
- mzId: CD_ASBC-SMACC/management-zone/CDASBC-SMACC.id
- env: E2E
- tag: ASBC-SMACC
- skipDeployment: "true"
#INT dashboards for EMEA/NA/CN
#Dry-run needed for all hubs
CDASBC-SMACC-INT:
- name: CD_ASBC-SMACC INT
- mzName: CD_ASBC-SMACC/management-zone/CDASBC-SMACC.name
- mzId: CD_ASBC-SMACC/management-zone/CDASBC-SMACC.id
- env: INT
- tag: ASBC-SMACC
- skipDeployment: "true"
#Configuration
CDASBC-SMACC-INT.EMEA-PreProd:
- name: CD_ASBC-SMACC INT
- mzName: CD_ASBC-SMACC/management-zone/CDASBC-SMACC.name
- mzId: CD_ASBC-SMACC/management-zone/CDASBC-SMACC.id
- env: INT
- tag: ASBC-SMACC
- skipDeployment: "false"
CDASBC-SMACC-INT.NA-PreProd:
- name: CD_ASBC-SMACC INT
- mzName: CD_ASBC-SMACC/management-zone/CDASBC-SMACC.name
- mzId: CD_ASBC-SMACC/management-zone/CDASBC-SMACC.id
- env: INT
- skipDeployment: "false"
CDASBC-SMACC-INT.CN-PreProd:
- name: CD_ASBC-SMACC INT
- mzName: CD_ASBC-SMACC/management-zone/CDASBC-SMACC.name
- mzId: CD_ASBC-SMACC/management-zone/CDASBC-SMACC.id
- env: INT
- skipDeployment: "false"
#TEST dashboards for EMEA/NA/CN
#Dry-run needed for all hubs
CDASBC-SMACC-TEST:
- name: CD_ASBC-SMACC TEST
- mzName: CD_ASBC-SMACC/management-zone/CDASBC-SMACC.name
- mzId: CD_ASBC-SMACC/management-zone/CDASBC-SMACC.id
- tag: ASBC-SMACC
- env: TEST
- skipDeployment: "true"
#Configuration
CDASBC-SMACC-TEST.EMEA-PreProd:
- name: CD_ASBC-SMACC TEST
- mzName: CD_ASBC-SMACC/management-zone/CDASBC-SMACC.name
- mzId: CD_ASBC-SMACC/management-zone/CDASBC-SMACC.id
- tag: ASBC-SMACC
- env: TEST
- skipDeployment: "false"
CDASBC-SMACC-TEST.NA-PreProd:
- name: CD_ASBC-SMACC TEST
- mzName: CD_ASBC-SMACC/management-zone/CDASBC-SMACC.name
- mzId: CD_ASBC-SMACC/management-zone/CDASBC-SMACC.id
- env: TEST
- skipDeployment: "false"
CDASBC-SMACC-TEST.CN-PreProd:
- name: CD_ASBC-SMACC TEST
- mzName: CD_ASBC-SMACC/management-zone/CDASBC-SMACC.name
- mzId: CD_ASBC-SMACC/management-zone/CDASBC-SMACC.id
- env: TEST
- skipDeployment: "false"

View File

@ -0,0 +1,308 @@
{
"metadata": {
"configurationVersions": [
3
],
"clusterVersion": "1.214.107.20210407-223952"
},
"dashboardMetadata": {
"name": "{{.name}}",
"shared": true,
"owner": "Ignacio.Goldman@partner.bmwgroup.com",
"dashboardFilter": {
"timeframe": "-24h to now"
},
"tags": [
"{{.tag}}"
]
},
"tiles": [
{
"name": "Custom chart",
"tileType": "CUSTOM_CHARTING",
"configured": true,
"bounds": {
"top": 228,
"left": 38,
"width": 1064,
"height": 304
},
"tileFilter": {},
"filterConfig": {
"type": "MIXED",
"customName": "Failure rate (HTTP 4xx/5xx errors)",
"defaultName": "Custom chart",
"chartConfig": {
"legendShown": true,
"type": "TIMESERIES",
"series": [
{
"metric": "builtin:service.errors.fourxx.rate",
"aggregation": "AVG",
"type": "BAR",
"entityType": "SERVICE",
"dimensions": [],
"sortAscending": false,
"sortColumn": false,
"aggregationRate": "TOTAL"
},
{
"metric": "builtin:service.errors.fivexx.rate",
"aggregation": "AVG",
"type": "BAR",
"entityType": "SERVICE",
"dimensions": [],
"sortAscending": false,
"sortColumn": true,
"aggregationRate": "TOTAL"
}
],
"resultMetadata": {
"nullbuiltin:service.errors.fivexx.rate|AVG|TOTAL|BAR|SERVICE": {
"lastModified": 1617956393463,
"customColor": "#ff0000"
},
"nullbuiltin:service.errors.fourxx.rate|AVG|TOTAL|BAR|SERVICE": {
"lastModified": 1617956441725,
"customColor": "#fff29a"
}
}
},
"filtersPerEntityType": {
"SERVICE": {
"AUTO_TAGS": [
"Environment:{{.env}}",
"Component:{{.tag}}"
]
}
}
}
},
{
"name": "Problems",
"tileType": "OPEN_PROBLEMS",
"configured": true,
"bounds": {
"top": 38,
"left": 950,
"width": 152,
"height": 152
},
"tileFilter": {
"managementZone": {
"id": "{{.mzId}}",
"name": "{{.mzName}}"
}
}
},
{
"name": "Overall Health",
"tileType": "HEADER",
"configured": true,
"bounds": {
"top": 0,
"left": 38,
"width": 1064,
"height": 38
},
"tileFilter": {}
},
{
"name": "Markdown",
"tileType": "MARKDOWN",
"configured": true,
"bounds": {
"top": 532,
"left": 38,
"width": 1064,
"height": 38
},
"tileFilter": {},
"markdown": "---\n"
},
{
"name": "Custom chart",
"tileType": "CUSTOM_CHARTING",
"configured": true,
"bounds": {
"top": 570,
"left": 38,
"width": 1064,
"height": 304
},
"tileFilter": {},
"filterConfig": {
"type": "MIXED",
"customName": "Response time, Request Count and Number of Errors",
"defaultName": "Custom chart",
"chartConfig": {
"legendShown": true,
"type": "TIMESERIES",
"series": [
{
"metric": "builtin:service.response.time",
"aggregation": "AVG",
"type": "LINE",
"entityType": "SERVICE",
"dimensions": [],
"sortAscending": false,
"sortColumn": false,
"aggregationRate": "TOTAL"
},
{
"metric": "builtin:service.requestCount.total",
"aggregation": "NONE",
"type": "BAR",
"entityType": "SERVICE",
"dimensions": [],
"sortAscending": false,
"sortColumn": false,
"aggregationRate": "TOTAL"
},
{
"metric": "builtin:service.errors.total.count",
"aggregation": "NONE",
"type": "BAR",
"entityType": "SERVICE",
"dimensions": [],
"sortAscending": false,
"sortColumn": true,
"aggregationRate": "TOTAL"
}
],
"resultMetadata": {
"nullbuiltin:service.requestCount.total|NONE|TOTAL|BAR|SERVICE": {
"lastModified": 1595275720776,
"customColor": "#008cdb"
},
"nullbuiltin:service.errors.total.count|NONE|TOTAL|BAR|SERVICE": {
"lastModified": 1595275955999,
"customColor": "#ef651f"
},
"nullbuiltin:service.response.time|AVG|TOTAL|LINE|SERVICE": {
"lastModified": 1595275686773,
"customColor": "#b4e5f9"
}
}
},
"filtersPerEntityType": {
"SERVICE": {
"AUTO_TAGS": [
"Environment:{{.env}}",
"Component:{{.tag}}"
]
}
}
}
},
{
"name": "Markdown",
"tileType": "MARKDOWN",
"configured": true,
"bounds": {
"top": 190,
"left": 38,
"width": 1064,
"height": 38
},
"tileFilter": {},
"markdown": "---\n"
},
{
"name": "",
"tileType": "DATABASES_OVERVIEW",
"configured": true,
"bounds": {
"top": 38,
"left": 646,
"width": 190,
"height": 152
},
"tileFilter": {},
"filterConfig": {
"type": "DATABASE",
"customName": "Databases",
"defaultName": "Databases",
"chartConfig": {
"legendShown": true,
"type": "TIMESERIES",
"series": [],
"resultMetadata": {}
},
"filtersPerEntityType": {
"DATABASE": {
"AUTO_TAGS": [
"Environment:{{.env}}",
"Component:{{.tag}}"
]
}
}
},
"chartVisible": true
},
{
"name": "",
"tileType": "SERVICES",
"configured": true,
"bounds": {
"top": 38,
"left": 342,
"width": 190,
"height": 152
},
"tileFilter": {},
"filterConfig": {
"type": "SERVICE",
"customName": "Services",
"defaultName": "Services",
"chartConfig": {
"legendShown": true,
"type": "TIMESERIES",
"series": [],
"resultMetadata": {}
},
"filtersPerEntityType": {
"SERVICE": {
"AUTO_TAGS": [
"Environment:{{.env}}",
"Component:{{.tag}}"
]
}
}
},
"chartVisible": true
},
{
"name": "",
"tileType": "HOSTS",
"configured": true,
"bounds": {
"top": 38,
"left": 38,
"width": 190,
"height": 152
},
"tileFilter": {},
"filterConfig": {
"type": "HOST",
"customName": "Hosts",
"defaultName": "Hosts",
"chartConfig": {
"legendShown": true,
"type": "TIMESERIES",
"series": [],
"resultMetadata": {}
},
"filtersPerEntityType": {
"HOST": {
"AUTO_TAGS": [
"Environment:{{.env}}",
"Component:{{.tag}}"
]
}
}
},
"chartVisible": true
}
]
}

View File

@ -0,0 +1,4 @@
### How to configure synthetics?
Please refer to [this](https://atc.bmwgroup.net/confluence/display/OPMAAS/Documentation+%7C+Synthetic+Monitors) page to configure your synthetics.

View File

@ -0,0 +1,82 @@
{
"anomalyDetection": {
"loadingTimeThresholds": {
"enabled": false,
"thresholds": [
{
"type": "TOTAL",
"valueMs": 0
}
]
},
"outageHandling": {
"globalOutage": true,
"localOutage": false,
"localOutagePolicy": {
"affectedLocations": 1,
"consecutiveRuns": 3
}
}
},
"automaticallyAssignedApps": [],
"enabled": true,
"frequencyMin": 1,
"locations": [
"{{.location}}"
],
"managementZones": [
{
"id": "{{.mzId}}",
"name": "{{.mzName}}"
}
],
"manuallyAssignedApps": [],
"name": "{{.name}}",
"requests": [
{
"entityId": "HTTP_CHECK_STEP-0BA53EC80CD7EE5A",
"name": "{{.name}}",
"sequenceNumber": 1
}
],
"script": {
"requests": [
{
"configuration": {
"acceptAnyCertificate": true,
"followRedirects": true,
"requestHeaders": [
{
"name": "accept",
"value": "application/json"
},
{
"name": "Content-Type",
"value": "application/json"
},
{
"name": "api_key",
"value": "355DE89C-7B72-4EA3-BDD8-157C79EB2C23"
}
]
},
"description": "{{.name}}",
"method": "GET",
"url": "{{.endpoint}}",
"validation": {
"rules": [
{
"passIfFound": true,
"type": "httpStatusesList",
"value": "200"
}
],
"rulesChaining": "or"
}
}
],
"version": "1.0"
},
"tags": [],
"type": "HTTP"
}

Some files were not shown because too many files have changed in this diff Show More