• 0

Unable to get eventsources list using REST API


Javier
 Share

Question

I am trying to get eventsources information using REST API, as documented here.

I am using a small python script to try to get any results, but can only get this output:

('Response Status:', 406)
('Response Body:', '<!doctype html><html lang="en"><head><title>HTTP Status 406 \xe2\x80\x93 Not Acceptable</title><style type="text/css">body {font-family:Tahoma,Arial,sans-serif;} h1, h2, h3, b {color:white;background-color:#525D76;} h1 {font-size:22px;} h2 {font-size:16px;} h3 {font-size:14px;} p {font-size:12px;} a {color:black;} .line {height:1px;background-color:#525D76;border:none;}</style></head><body><h1>HTTP Status 406 \xe2\x80\x93 Not Acceptable</h1><hr class="line" /><p><b>Type</b> Status Report</p><p><b>Message</b> Not Acceptable</p><p><b>Description</b> The target resource does not have a current representation that would be acceptable to the user agent, according to the proactive negotiation header fields received in the request, and the server is unwilling to supply a default representation.</p><hr class="line" /><h3>LogicMonitor Technical Operations</h3></body></html>')

Did anybody get this type of call working anytime?

Apart from this, I would like to add new eventsources using the REST API. It looks like there is only an import method to get this, using a XML file.

Are there any examples or templates of that XML file?

Thanks and regards.

Link to comment
Share on other sites

10 answers to this question

Recommended Posts

  • 0

Can you provide some example code? They fact that your getting html response instead of JSON likely means something more fundamental is an issue then the specific EventSource API details. You might want to use some of the REST v1 examples on the support pages, to make sure any API calls work, then you can convert them to v2 convention.

Based on the v2 docs, it does look like import via XML is the documented method to create EventSources. You might need to generate the XML file (perhaps by having an XML template that the script modifies) to provide into the API call.

Link to comment
Share on other sites

  • 0
  • Administrators

You can get an example XML file by exporting any EventSource from the UI. Just navigate to an EventSource >> More >> Export. 

As far as the get request, i get the same thing if i don't specify "2" in the X-Version header. Basically, the endpoint for v1 appears to be only partially implemented. Use v2 of the API.

Link to comment
Share on other sites

  • 0

Thanks for the clue!!

I solved the problem with my python script. The solution was to include ?v=2 as the first parameter:

https://xxxxx.logicmonitor.com/santaba/rest/setting/eventsources?v=2

 

I also found that option to export an eventsource to a XML file using the UI. I hope I can work with that pretty well.

Thanks a lot for your help!

Link to comment
Share on other sites

  • 0
  • Administrators

No problem. FWIW, adding it as a query parameter is one supported way. The other supported way is to specify "2" in the header "X-Version". https://www.logicmonitor.com/support/rest-api-developers-guide/v2/rest-api-v2-overview#:~:text=you can make v2 requests by including a ‘%3Fv%3D2’ query parameter or by including a ‘X-Version%3A2’ header.

  • Thanks 1
Link to comment
Share on other sites

  • 0

Hi again,

I prepared my script to programmatically create the XML file to define new EventSources. I test it successfully from the UI, using "Add" - "From File".

Now I would like to use the API to make such a call. According swagger documentation here, it looks like I need to provide this file as a parameter, but I don't have a clear idea on how to provide that. I tried several methods, but none of them worked so far:

Using any of these methods, I always get an error "HTTP 415 Unsupported Media Type". 

What am I doing wrong? 

Link to comment
Share on other sites

  • 0
9 hours ago, Javier said:

Hi again,

I prepared my script to programmatically create the XML file to define new EventSources. I test it successfully from the UI, using "Add" - "From File".

Now I would like to use the API to make such a call. According swagger documentation here, it looks like I need to provide this file as a parameter, but I don't have a clear idea on how to provide that. I tried several methods, but none of them worked so far:

Using any of these methods, I always get an error "HTTP 415 Unsupported Media Type". 

What am I doing wrong? 

 

Set the content type as multipart/form-data then send a file object as a local file read for python

 

header = {'Content-Type': 'multipart/form-data', 'Authorization': 'LMv1....'}
files = {'file': ('file.xml', open('file.xml', 'rb'),'text/xml')}

r = requests.post(url, headers=header, files=files, verify=False)

 

 

You would be much better using the SDK though

Link to comment
Share on other sites

  • 0

I am trying this and found several problems.

When using on the header, the "Content-Type" spec, I always get an error 500 with an "Unknown error" message. I tried removing it and it looks to work better.

Now I am getting a clear "Authentication failed" error message. I think the problem I have now is creating the correct authentication string. As this string is build with, among others, the request details, I don't know how to correctly append this "files" variable (a dictionary object) to the request variable using this piece of code:

#Concatenate Request details
requestVars = httpVerb + epoch + data + resourcePath

#Construct signature
signature = base64.b64encode(hmac.new(AccessKey,msg=requestVars,digestmod=hashlib.sha256).hexdigest())

#Construct headers
auth = 'LMv1 ' + AccessId + ':' + signature + ':' + epoch
headers = {'Authorization':auth}

In this case, "data" is not a string, but a dictionary containing a file object.

How authorization string should be built for this particular case?

I will have a look at the SDK anytime, as suggested.

Link to comment
Share on other sites

  • 0

I finally changed my code to use the SDK. I recognize I didn't use it at the first time as it looked somehow complicated. When I saw this example code I realized it was really simple to use. 

Now my code works perfectly! Thanks a lot for your help!

 

  • Like 1
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share