mirror of
https://github.com/elastic/logstash.git
synced 2025-04-24 22:57:16 -04:00
experimental datadog event output
This commit is contained in:
parent
ecb697f9ef
commit
0260e31536
1 changed files with 92 additions and 0 deletions
92
lib/logstash/outputs/datadog.rb
Normal file
92
lib/logstash/outputs/datadog.rb
Normal file
|
@ -0,0 +1,92 @@
|
||||||
|
require "logstash/outputs/base"
|
||||||
|
require "logstash/namespace"
|
||||||
|
|
||||||
|
class LogStash::Outputs::Datadog < LogStash::Outputs::Base
|
||||||
|
# This output lets you send events (for now. soon metrics) to
|
||||||
|
# DataDogHQ based on Logstash events
|
||||||
|
#
|
||||||
|
# Note that since Logstash maintains no state
|
||||||
|
# these will be one-shot events
|
||||||
|
#
|
||||||
|
|
||||||
|
config_name "datadog"
|
||||||
|
plugin_status "experimental"
|
||||||
|
|
||||||
|
# Your DatadogHQ API key
|
||||||
|
config :api_key, :validate => :string, :required => true
|
||||||
|
|
||||||
|
# Title
|
||||||
|
config :title, :validate => :string, :default => "Logstash event for %{@source_host}"
|
||||||
|
|
||||||
|
# Text
|
||||||
|
config :text, :validate => :string, :default => "%{@message}"
|
||||||
|
|
||||||
|
# Date Happened
|
||||||
|
config :date_happened, :validate => :string
|
||||||
|
|
||||||
|
# Source type name
|
||||||
|
config :source_type_name, :validate => ["nagios", "hudson", "jenkins", "user", "my apps", "feed", "chef", "puppet", "git", "bitbucket"], :default => "my apps"
|
||||||
|
|
||||||
|
# Alert type
|
||||||
|
config :alert_type, :validate => ["info", "error", "warning", "success"]
|
||||||
|
|
||||||
|
# Priority
|
||||||
|
config :priority, :validate => ["normal", "low"]
|
||||||
|
|
||||||
|
# Tags
|
||||||
|
# Set any custom tags for this event
|
||||||
|
# Default are the Logstash tags if any
|
||||||
|
config :dd_tags, :validate => :array
|
||||||
|
|
||||||
|
public
|
||||||
|
def register
|
||||||
|
require "net/https"
|
||||||
|
require "uri"
|
||||||
|
@url = "https://app.datadoghq.com/api/v1/events"
|
||||||
|
@uri = URI.parse(@url)
|
||||||
|
@client = Net::HTTP.new(@uri.host, @uri.port)
|
||||||
|
@client.use_ssl = true
|
||||||
|
@client.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
||||||
|
@logger.debug("Client", :client => @client.inspect)
|
||||||
|
end # def register
|
||||||
|
|
||||||
|
public
|
||||||
|
def receive(event)
|
||||||
|
return unless output?(event)
|
||||||
|
|
||||||
|
|
||||||
|
dd_event = Hash.new
|
||||||
|
dd_event['title'] = event.sprintf(@title)
|
||||||
|
dd_event['text'] = event.sprintf(@text)
|
||||||
|
dd_event['source_type_name'] = @source_type_name
|
||||||
|
dd_event['alert_type'] = @alert_type if @alert_type
|
||||||
|
dd_event['priority'] = @priority if @priority
|
||||||
|
|
||||||
|
if @date_happened
|
||||||
|
dd_event['date_happened'] = event.sprintf(@date_happened)
|
||||||
|
else
|
||||||
|
dd_event['date_happened'] = event.unix_timestamp.to_i
|
||||||
|
end
|
||||||
|
|
||||||
|
if @dd_tags
|
||||||
|
tagz = @dd_tags.collect {|x| event.sprintf(x) }
|
||||||
|
else
|
||||||
|
tagz = event.tags
|
||||||
|
end
|
||||||
|
dd_event['tags'] = tagz if tagz
|
||||||
|
|
||||||
|
@logger.debug("DataDog event", :dd_event => dd_event)
|
||||||
|
|
||||||
|
request = Net::HTTP::Post.new("#{@uri.path}?api_key=#{@api_key}")
|
||||||
|
|
||||||
|
begin
|
||||||
|
request.body = dd_event.to_json
|
||||||
|
request.add_field("Content-Type", 'application/json')
|
||||||
|
response = @client.request(request)
|
||||||
|
@logger.info("DD convo", :request => request.inspect, :response => response.inspect)
|
||||||
|
raise unless response.code == '200'
|
||||||
|
rescue Exception => e
|
||||||
|
@logger.warn("Unhandled exception", :request => request.inspect, :response => response.inspect, :exception => e.inspect)
|
||||||
|
end
|
||||||
|
end # def receive
|
||||||
|
end
|
Loading…
Add table
Add a link
Reference in a new issue