require "json" require "uri" require "time" require "net/http" require "net/https" module Keen class Client attr_accessor :project_id, :api_key, :options, :logging def base_url if @options[:base_url] @options[:base_url] else "https://api.keen.io/3.0" end end def ssl_cert_file File.expand_path("../../../conf/cacert.pem", __FILE__) end def initialize(project_id, api_key, options = {}) raise "project_id must be string" unless project_id.kind_of? String raise "api_key must be string" unless api_key.kind_of? String default_options = { :logging => true, } options = default_options.update(options) @project_id = project_id @api_key = api_key @logging = options[:logging] @options = options end def add_event(event_collection, event_properties, timestamp=nil) # # `event_collection` should be a string # # `event` should be a JSON-serializable hash # # `timestamp` is optional. If sent, it should be a Time instance. # If it's not sent, we'll use the current time. validate_event_collection(event_collection) if timestamp timestamp = timestamp.utc.iso8601 end event = Keen::Event.new(event_collection, event_properties) # build the request: url = "#{base_url}/projects/#{project_id}/events/#{event_collection}" uri = URI.parse(url) http = Net::HTTP.new(uri.host, uri.port) http.use_ssl = true http.ca_file = ssl_cert_file http.verify_mode = OpenSSL::SSL::VERIFY_PEER http.verify_depth = 5 request = Net::HTTP::Post.new(uri.path) body = event.properties if timestamp request.body[:keen] = { :timestamp => timestamp } end request.body = JSON.generate(body) request["Content-Type"] = "application/json" request["Authorization"] = @api_key response = http.request(request) JSON.parse response.body end def validate_event_collection(event_collection) # TODO end end end