const https = require("https");
|
|
const url = require("url");
|
|
const util = require("util");
|
|
const extend = require("extend");
|
|
const _ = require('lodash');
|
|
const json = require("./json");
|
|
|
|
/*section: client
|
|
*comment: |
|
|
* the constructor for _client_ object
|
|
*params:
|
|
*example: |
|
|
* See [client.request](#client-request)
|
|
*/
|
|
const DatadogMetricClient = function(options){
|
|
this.api_key = options.api_key || null;
|
|
this.app_key = options.app_key || null;
|
|
this.proxy_agent = options.proxy_agent || null;
|
|
this.http_options = options.http_options || null;
|
|
this.api_version = options.api_version || "v1";
|
|
this.api_host = options.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);
|
|
* });
|
|
* ```
|
|
*/
|
|
DatadogMetricClient.prototype.request = function(method, path, params, callback){
|
|
if(arguments.length === 3 && typeof arguments[2] === "function"){
|
|
callback = arguments[2];
|
|
params = {body: ''}; // create params with empty body property
|
|
}
|
|
|
|
const body = (typeof params["body"] === "object") ? json.stringify(params["body"]) : params["body"];
|
|
const 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,
|
|
});
|
|
|
|
const http_options = _.assign({
|
|
hostname: this.api_host,
|
|
port: 443,
|
|
method: method.toUpperCase(),
|
|
path: path
|
|
}, this.http_options);
|
|
|
|
if(this.proxy_agent){
|
|
http_options["agent"] = this.proxy_agent;
|
|
}
|
|
|
|
if(["POST", "PUT"].indexOf(http_options["method"]) >= 0){
|
|
http_options["headers"] = {
|
|
"Content-Type": params["contentType"] ? params["contentType"] : "application/json",
|
|
"Content-Length": Buffer.byteLength(body),
|
|
};
|
|
}
|
|
|
|
const req = https.request(http_options, function(res){
|
|
res.on("error", function(err){
|
|
if(typeof callback == "function"){
|
|
callback(err, null, res.statusCode);
|
|
}
|
|
});
|
|
|
|
let data = "";
|
|
res.on("data", function(chunk){
|
|
data += chunk;
|
|
});
|
|
|
|
res.on("end", function(){
|
|
let 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);
|
|
}
|
|
});
|
|
});
|
|
|
|
req.setTimeout(30000, function(){
|
|
req.abort();
|
|
});
|
|
|
|
// 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 = DatadogMetricClient;
|