Problem
I want to enable/disable synthetic jobs programmatically in order to automate the process during the planned downtimes so that false alerts are not generated.
Solution
For dealing with synthetic jobs, use the https://api.eum-appdynamics.com endpoint to make changes to the schedule, and either enable or disable jobs.
To use this API, use your username and password for authentication. The username should be the EUM account name, and the password should be the EUM license key. These can be found on the licensing page in the controller UI by clicking on the gear menu in the upper right corner of the controller UI, clicking on license and then scrolling down to "End User Monitoring" as seen in the screenshot below.
The APIs below can be used to get and modify the schedules:
Get a list of all the synthetic jobs available for the authenticated user: GET https://api.eum-appdynamics.com/v1/synthetic/schedule
Get the exact job identified by the schedule ID. To find the schedule ID and description, use the previous request to get a list of all jobs: GET https://api.eum-appdynamics.com/v1/synthetic/schedule/<schedule_id>
Modify the schedule according to the new schedule object provided in the body: PUT https://api.eum-appdynamics.com/v1/synthetic/schedule/<schedule_id> Use the response body from the previous request to get the exact job using the schedule ID as the JSON body. The field "userEnabled" controls whether the job is enabled or disabled, and will show the same result as enabling/disabling from the UI.
Sample curl implementation
Get a particular schedule
Modify the given schedule
Create your own script
Enable a particular job
Disable a particular job
synth.py
Get all schedules
curl -XGET --user AppDynamics-a0Q340ABCDEABCDEAV:9ba9bd3b-652d-abcd-abcd-abcdefecd4f0 https://api.eum-appdynamics.com/v1/synthetic/schedule
Output:
{
"_first": null,
"_items": [
{
"_id": "fcedd1d0-88bc-49c1-9bbe-397227616d1f",
"appKey": "AD-AAB-WWW-WWW",
"browserCodes": [
"Chrome"
],
"captureVisualMetrics": true,
"created": "2016-11-02T04:07:22.764Z",
.....
Get a particular schedule
curl -XGET --user AppDynamics-a0Q340ABCDEABCDEAV:9ba9bd3b-652d-abcd-abcd-abcdefecd4f0 https://api.eum-appdynamics.com/v1/synthetic/schedule/fcedd1d0-88bc-49c1-9bbe-397227616d1f 2>/dev/null|python -m json.tool
{
"_id": "fcedd1d0-88bc-49c1-9bbe-397227616d1f",
.....
"userEnabled": false,
"version": 13
}
Modify the given schedule
curl -XPUT --user AppDynamics-a0Q340ABCDEABCDEAV:9ba9bd3b-652d-abcd-abcd-abcdefecd4f0 -H"Content-Type: application/json" -d '{
"_id": "fcedd1d0-88bc-49c1-9bbe-397227616d1f",
.....
"userEnabled": true,
"version": 13
}' https://api.eum-appdynamics.com/v1/synthetic/schedule/fcedd1d0-88bc-49c1-9bbe-397227616d1f
Create your own script
Use the following Python implementation as a starting point to create your own script.
osxltmkshi:analytics-agent mayuresh.kshirsagar$ python ~/Desktop/synth.py --help
usage: synth.py [-h] -n <eum_account_name> -l <eum_license_name>
[-u <eum_url>] -j <synth_job_name> [-e]
optional arguments:
-h, --help show this help message and exit
-n <eum_account_name>, --eumaccountname <eum_account_name>
EUM Account Name
-l <eum_license_name>, --eumlicensekey <eum_license_name>
EUM License Key
-u <eum_url>, --url <eum_url>
EUM Server URL, Defaults to https://api.eum-
appdynamics.com
-j <synth_job_name>, --job <synth_job_name>
Job Name
-e, --enable Enable Job - If present marks the job enabled. If
absent, marks the job disabled
Enable a particular job
python ~/Desktop/synth.py -n AppDynamics-a0Q340ABCDEABCDEAV -l 9ba9bd3b-652d-abcd-abcd-abcdefecd4f0 -j 90220 -e
Disable a particular job
python ~/Desktop/synth.py -n AppDynamics-a0Q340ABCDEABCDEAV -l 9ba9bd3b-652d-abcd-abcd-abcdefecd4f0 -j 90220
synth.py
Click "Learn More" to view the synth.py file
Spoiler (Highlight to read) # -*- coding: utf-8 -*-
import requests
import argparse
import sys
import json
def find(list, filter):
for x in list:
if filter(x):
return x
return None
def main():
accountname=None
licensekey=None
url=None
jobname=None
enable=False
getallschedules="/v1/synthetic/schedule"
scheduleendpoint="/v1/synthetic/schedule/"
parser = argparse.ArgumentParser()
parser.add_argument("-n", "--eumaccountname", help="EUM Account Name", required=True, metavar='<eum_account_name>')
parser.add_argument("-l", "--eumlicensekey", help="EUM License Key", required=True, metavar='<eum_license_name>')
parser.add_argument("-u", "--url", help="EUM Server URL, Defaults to https://api.eum-appdynamics.com", default="https://api.eum-appdynamics.com", required=False, metavar='<eum_url>')
parser.add_argument("-j", "--job", help="Job Name", required=True, metavar='<synth_job_name>')
parser.add_argument("-e", "--enable", help="Enable Job - If present marks the job enabled. If absent, marks the job disabled", default=False, action="store_true", required=False)
args = parser.parse_args()
accountname=args.eumaccountname
licensekey=args.eumlicensekey
url=args.url
jobname=args.job
enable=args.enable
# Get all the schedules
response = requests.get(url + getallschedules,auth=(accountname,licensekey))
if response.status_code != 200:
print "Error Occurred. Status Code: " + str(response.status_code) + " Response: " + json.dumps(json.loads(response.text),indent=3)
sys.exit(1)
_json = json.loads(response.text)
_items= _json['_items']
_return = find(_items, lambda x: x['description'] == jobname)
scheduleid=_return['_id']
# Get the individual schedule matching the description
response = requests.get(url + scheduleendpoint + scheduleid,auth=(accountname, licensekey))
if response.status_code != 200:
print "Error Occurred. Status Code: " + str(response.status_code) + " Response: " + json.dumps(json.loads(response.text),indent=3)
sys.exit(1)
_json = json.loads(response.text)
_json['userEnabled'] = enable
_json=json.dumps(_json, indent=3)
print "Request: " + _json
headers = {'Content-type': 'application/json'}
# Modify the schedule
response = requests.put(url + scheduleendpoint + scheduleid, auth=(accountname, licensekey), headers=headers, data=_json)
if response.status_code != 200:
print "Error Occurred. Status Code: " + str(response.status_code) + " Response: " + json.dumps(json.loads(response.text),indent=3)
sys.exit(1)
_json = json.loads(response.text)
_json=json.dumps(_json, indent=3)
print "Response: " + _json
if __name__ == "__main__":
main() # -*- coding: utf-8 -*-
import requests
import argparse
import sys
import json
def find(list, filter):
for x in list:
if filter(x):
return x
return None
def main():
accountname=None
licensekey=None
url=None
jobname=None
enable=False
getallschedules="/v1/synthetic/schedule"
scheduleendpoint="/v1/synthetic/schedule/"
parser = argparse.ArgumentParser()
parser.add_argument("-n", "--eumaccountname", help="EUM Account Name", required=True, metavar='<eum_account_name>')
parser.add_argument("-l", "--eumlicensekey", help="EUM License Key", required=True, metavar='<eum_license_name>')
parser.add_argument("-u", "--url", help="EUM Server URL, Defaults to https://api.eum-appdynamics.com", default="https://api.eum-appdynamics.com", required=False, metavar='<eum_url>')
parser.add_argument("-j", "--job", help="Job Name", required=True, metavar='<synth_job_name>')
parser.add_argument("-e", "--enable", help="Enable Job - If present marks the job enabled. If absent, marks the job disabled", default=False, action="store_true", required=False)
args = parser.parse_args()
accountname=args.eumaccountname
licensekey=args.eumlicensekey
url=args.url
jobname=args.job
enable=args.enable
# Get all the schedules
response = requests.get(url + getallschedules,auth=(accountname,licensekey))
if response.status_code != 200:
print "Error Occurred. Status Code: " + str(response.status_code) + " Response: " + json.dumps(json.loads(response.text),indent=3)
sys.exit(1)
_json = json.loads(response.text)
_items= _json['_items']
_return = find(_items, lambda x: x['description'] == jobname)
scheduleid=_return['_id']
# Get the individual schedule matching the description
response = requests.get(url + scheduleendpoint + scheduleid,auth=(accountname, licensekey))
if response.status_code != 200:
print "Error Occurred. Status Code: " + str(response.status_code) + " Response: " + json.dumps(json.loads(response.text),indent=3)
sys.exit(1)
_json = json.loads(response.text)
_json['userEnabled'] = enable
_json=json.dumps(_json, indent=3)
print "Request: " + _json
headers = {'Content-type': 'application/json'}
# Modify the schedule
response = requests.put(url + scheduleendpoint + scheduleid, auth=(accountname, licensekey), headers=headers, data=_json)
if response.status_code != 200:
print "Error Occurred. Status Code: " + str(response.status_code) + " Response: " + json.dumps(json.loads(response.text),indent=3)
sys.exit(1)
_json = json.loads(response.text)
_json=json.dumps(_json, indent=3)
print "Response: " + _json
if __name__ == "__main__":
main()
Related Links
Create scripts for synthetic jobs
Synthetic scripts FAQ
... View more