Datadog API Node.JS Client
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

125 lines
3.2 KiB

var extend = require("extend");
var https = require("https");
var url = require("url");
var util = require("util");
/*section: client
*comment: |
* the constructor for _client_ object
*params:
*example: |
* See [client.request](#client-request)
*/
var client = function(){
this.api_key = null;
this.app_key = null;
this.proxy_agent = null;
this.api_version = "v1";
this.api_host = "app.datadoghq.com";
};
/*section: client
*comment: |
* used to make a raw request to the datadog api
*params:
* method: |
* http method GET, POST, PUT, DELETE
* path: |
* the api url path e.g. /tags/hosts
* params: |
* an object which allows the keys `query` or `body`
* callback: |
* function to call on success/failure callback(err, result)
*example: |
* ```javascript
* var dogapi = require("dogapi");
* var options = {
* api_key: "api_key",
* app_key: "app_key"
* };
* dogapi.initialize(options);
* dogapi.client.request("GET", "/url/path", {}, function(err, results){
* console.dir(results);
* });
* ```
*/
client.prototype.request = function(method, path, params, callback){
if(arguments.length === 3 && typeof arguments[2] === "function"){
callback = arguments[2];
params = {};
}
params = params || {};
var body = (typeof params["body"] === "object")? JSON.stringify(params["body"]) : params["body"];
var query = {
"api_key": this.api_key,
"application_key": this.app_key,
};
if(typeof params["query"] === "object"){
extend(query, params["query"]);
}
path = url.format({
"pathname": util.format("/api/%s%s", this.api_version, path),
"query": query,
});
var http_options = {
hostname: this.api_host,
port: 443,
method: method.toUpperCase(),
path: path
};
if(this.proxy_agent)
http_options["agent"] = this.proxy_agent;
if(["POST", "PUT"].indexOf(http_options["method"]) >= 0){
http_options["headers"] = {
"Content-Type": "application/json",
"Content-Length": body.length,
};
}
var req = https.request(http_options, function(res){
res.on("error", function(err){
if(typeof callback == "function"){
callback(err, null, res.statusCode);
}
});
var data = "";
res.on("data", function(chunk){
data += chunk;
});
res.on("end", function(){
var error = null;
try{ data = JSON.parse(data); }catch(e){}
if(data["errors"]){
error = data["errors"];
data = null;
}
if(typeof callback === "function"){
callback(error, data, res.statusCode);
}
});
});
// This should only occur for errors such as a socket hang up prior to any
// data being received, or SSL-related issues.
req.on("error", function(err){
if(typeof callback === "function"){
callback(err, null, 0);
}
});
if(["POST", "PUT"].indexOf(http_options["method"]) >= 0){
req.write(body);
}
req.end()
};
module.exports = new client();