require 'time'
require 'dogapi/v1'
module Dogapi
# A simple DogAPI client
#
# See Dogapi::V1 for the thick underlying clients
#
# Class methods return a tuple of (+response_code+, +response_body+). Unless otherwise noted, the response body is deserialized JSON. Up-to-date information about the JSON object structure is available in the HTTP API documentation, here[https://github.com/DataDog/dogapi/wiki].
class Client
# Create a new Client optionally specifying a default host and device
def initialize(api_key, application_key=nil, host=nil, device=nil, silent=true, timeout=nil)
if api_key
@api_key = api_key
else
raise 'Please provide an API key to submit your data'
end
@application_key = application_key
@datadog_host = Dogapi.find_datadog_host()
@host = host ||= Dogapi.find_localhost()
@device = device
# FIXME: refactor to avoid all this code duplication
@metric_svc = Dogapi::V1::MetricService.new(@api_key, @application_key, silent, timeout)
@event_svc = Dogapi::V1::EventService.new(@api_key, @application_key, silent, timeout)
@tag_svc = Dogapi::V1::TagService.new(@api_key, @application_key, silent, timeout)
@comment_svc = Dogapi::V1::CommentService.new(@api_key, @application_key, silent, timeout)
@search_svc = Dogapi::V1::SearchService.new(@api_key, @application_key, silent, timeout)
@dash_service = Dogapi::V1::DashService.new(@api_key, @application_key, silent, timeout)
@alert_svc = Dogapi::V1::AlertService.new(@api_key, @application_key, silent, timeout)
@user_svc = Dogapi::V1::UserService.new(@api_key, @application_key, silent, timeout)
@snapshot_svc = Dogapi::V1::SnapshotService.new(@api_key, @application_key, silent, timeout)
@embed_svc = Dogapi::V1::EmbedService.new(@api_key, @application_key, silent, timeout)
@screenboard_svc = Dogapi::V1::ScreenboardService.new(@api_key, @application_key, silent, timeout)
@monitor_svc = Dogapi::V1::MonitorService.new(@api_key, @application_key, silent, timeout)
@service_check_svc = Dogapi::V1::ServiceCheckService.new(@api_key, @application_key, silent, timeout)
@legacy_event_svc = Dogapi::EventService.new(@datadog_host)
end
#
# METRICS
# Record a single point of metric data
#
# Optional arguments:
# :timestamp => Ruby stdlib Time
# :host => String
# :device => String
# :options => Map
#
# options[:type] = "counter" to specify a counter metric
# options[:tags] = ["tag1", "tag2"] to tag the point
def emit_point(metric, value, options = {})
defaults = { :timestamp => Time.now }
options = defaults.merge(options)
self.emit_points(
metric,
[[options[:timestamp], value]],
options
)
end
# Record a set of points of metric data
#
# +points+ is an array of [Time, value] doubles
#
# Optional arguments:
# :host => String
# :device => String
# :options => Map
#
# options[:type] = "counter" to specify a counter metric
# options[:tags] = ["tag1", "tag2"] to tag the point
def emit_points(metric, points, options = {})
scope = override_scope options
points.each do |p|
p[0].kind_of? Time or raise "Not a Time"
p[0] = p[0].to_i
p[1] = p[1].to_f # TODO: stupid to_f will never raise an exception
end
@metric_svc.submit(metric, points, scope, options)
end
def batch_metrics()
@metric_svc.switch_to_batched
begin
yield
@metric_svc.flush_buffer # flush_buffer should returns the response from last API call
ensure
@metric_svc.switch_to_single
end
end
#
# EVENTS
# Record an event
#
# Optional arguments:
# :host => String
# :device => String
def emit_event(event, options = {})
scope = override_scope options
@event_svc.post(event, scope)
end
# Get the details of an event
#
# +id+ of the event to get
def get_event(id)
@event_svc.get(id)
end
# Get an optionally filtered event stream
#
# +start+ is a Time object for when to start the stream
#
# +stop+ is a Time object for when to end the stream
#
# Optional arguments:
# :priority => "normal" or "low"
# :sources => String, see https://github.com/DataDog/dogapi/wiki/Event for a current list of sources
# :tags => Array of Strings
def stream(start, stop, options = {})
@event_svc.stream(start, stop, options)
end
# DEPRECATED: Recording events with a duration has been deprecated.
# The functionality will be removed in a later release.
def start_event(event, options = {})
warn "[DEPRECATION] Dogapi::Client.start_event() is deprecated. Use `emit_event` instead."
defaults = { :source_type => nil }
options = defaults.merge(options)
scope = override_scope options
@legacy_event_svc.start(@api_key, event, scope, options[:source_type]) do
yield
end
end
#
# COMMENTS
#
# Post a comment
def comment(message, options = {})
@comment_svc.comment(message, options)
end
# Post a comment
def update_comment(comment_id, options = {})
@comment_svc.update_comment(comment_id, options)
end
def delete_comment(comment_id)
@comment_svc.delete_comment(comment_id)
end
#
# SEARCH
#
# Run the given search query.
def search(query)
@search_svc.search query
end
#
# TAGS
#
# Get all tags and their associated hosts at your org
def all_tags(source = nil)
@tag_svc.get_all(source)
end
# Get all tags for the given host
#
# +host_id+ can be the host's numeric id or string name
def host_tags(host_id, source = nil, by_source = false)
@tag_svc.get(host_id, source, by_source)
end
# Add the tags to the given host
#
# +host_id+ can be the host's numeric id or string name
#
# +tags+ is and Array of Strings
def add_tags(host_id, tags, source = nil)
@tag_svc.add(host_id, tags, source)
end
# Replace the tags on the given host
#
# +host_id+ can be the host's numeric id or string name
#
# +tags+ is and Array of Strings
def update_tags(host_id, tags, source = nil)
@tag_svc.update(host_id, tags, source)
end
# DEPRECATED: Spelling mistake temporarily preserved as an alias.
def detatch_tags(host_id)
warn "[DEPRECATION] Dogapi::Client.detatch() is deprecated. Use `detach` instead."
detach_tags(host_id)
end
# Remove all tags from the given host
#
# +host_id+ can be the host's numeric id or string name
def detach_tags(host_id, source = nil)
@tag_svc.detach(host_id, source)
end
#
# DASHES
#
# Create a dashboard.
def create_dashboard(title, description, graphs, template_variables = nil)
@dash_service.create_dashboard(title, description, graphs, template_variables)
end
# Update a dashboard.
def update_dashboard(dash_id, title, description, graphs, template_variables = nil)
@dash_service.update_dashboard(dash_id, title, description, graphs, template_variables)
end
# Fetch the given dashboard.
def get_dashboard(dash_id)
@dash_service.get_dashboard(dash_id)
end
# Fetch all of the dashboards.
def get_dashboards
@dash_service.get_dashboards
end
# Delete the given dashboard.
def delete_dashboard(dash_id)
@dash_service.delete_dashboard(dash_id)
end
#
# ALERTS
#
def alert(query, options = {})
@alert_svc.alert(query, options)
end
def update_alert(alert_id, query, options = {})
@alert_svc.update_alert(alert_id, query, options)
end
def get_alert(alert_id)
@alert_svc.get_alert(alert_id)
end
def delete_alert(alert_id)
@alert_svc.delete_alert(alert_id)
end
def get_all_alerts()
@alert_svc.get_all_alerts()
end
def mute_alerts()
@alert_svc.mute_alerts()
end
def unmute_alerts()
@alert_svc.unmute_alerts()
end
# User invite
def invite(emails, options = {})
@user_svc.invite(emails, options)
end
def create_user(description = {})
@user_svc.create_user(description)
end
def get_all_users()
@user_svc.get_all_users()
end
def get_user(handle)
@user_svc.get_user(handle)
end
def update_user(handle, description = {})
@user_svc.update_user(handle, description)
end
def disable_user(handle)
@user_svc.disable_user(handle)
end
# Graph snapshot
def graph_snapshot(metric_query, start_ts, end_ts, event_query = nil)
@snapshot_svc.snapshot(metric_query, start_ts, end_ts, event_query)
end
#
# EMBEDS
#
def get_all_embeds()
@embed_svc.get_all_embeds()
end
def get_embed(embed_id, description= {})
@embed_svc.get_embed(embed_id, description)
end
def create_embed(graph_json, description= {})
@embed_svc.create_embed(graph_json, description)
end
def enable_embed(embed_id)
@embed_svc.enable_embed(embed_id)
end
def revoke_embed(embed_id)
@embed_svc.revoke_embed(embed_id)
end
#
# SCREENBOARD
#
def create_screenboard(description)
@screenboard_svc.create_screenboard(description)
end
def update_screenboard(board_id, description)
@screenboard_svc.update_screenboard(board_id, description)
end
def get_screenboard(board_id)
@screenboard_svc.get_screenboard(board_id)
end
def get_all_screenboards()
@screenboard_svc.get_all_screenboards()
end
def delete_screenboard(board_id)
@screenboard_svc.delete_screenboard(board_id)
end
def share_screenboard(board_id)
@screenboard_svc.share_screenboard(board_id)
end
def revoke_screenboard(board_id)
@screenboard_svc.revoke_screenboard(board_id)
end
#
# MONITORS
#
def monitor(type, query, options = {})
@monitor_svc.monitor(type, query, options)
end
def update_monitor(monitor_id, query, options = {})
@monitor_svc.update_monitor(monitor_id, query, options)
end
def get_monitor(monitor_id, options = {})
@monitor_svc.get_monitor(monitor_id, options)
end
def delete_monitor(monitor_id)
@monitor_svc.delete_monitor(monitor_id)
end
def get_all_monitors(options = {})
@monitor_svc.get_all_monitors(options)
end
def mute_monitors()
@monitor_svc.mute_monitors()
end
def unmute_monitors()
@monitor_svc.unmute_monitors()
end
def mute_monitor(monitor_id, options = {})
@monitor_svc.mute_monitor(monitor_id, options)
end
def unmute_monitor(monitor_id, options = {})
@monitor_svc.unmute_monitor(monitor_id, options)
end
#
# MONITOR DOWNTIME
#
def schedule_downtime(scope, options = {})
@monitor_svc.schedule_downtime(scope, options)
end
def update_downtime(downtime_id, options = {})
@monitor_svc.update_downtime(downtime_id, options)
end
def get_downtime(downtime_id)
@monitor_svc.get_downtime(downtime_id)
end
def cancel_downtime(downtime_id)
@monitor_svc.cancel_downtime(downtime_id)
end
def get_all_downtimes(options = {})
@monitor_svc.get_all_downtimes(options)
end
#
# HOST MUTING
#
def mute_host(hostname, options = {})
@monitor_svc.mute_host(hostname, options)
end
def unmute_host(hostname)
@monitor_svc.unmute_host(hostname)
end
#
# SERVICE CHECKS
#
def service_check(check, host, status, options = {})
@service_check_svc.service_check(check, host, status, options)
end
private
def override_scope(options= {})
defaults = { :host => @host, :device => @device }
options = defaults.merge(options)
Scope.new(options[:host], options[:device])
end
end
end