class LogStash::Inputs::Meetup

Periodically query meetup.com regarding updates on events for the given meetupkey

Public Instance Methods

register() click to toggle source
# File lib/logstash/inputs/meetup.rb, line 38
def register
  require "faraday"

  if text
    # do this
      addon = "text=#{ @text }&and_text=true"
      @url = "https://api.meetup.com/2/open_events.json?key=#{ @meetupkey.value }&#{ addon }"
  else
      # group_id
    if groupid
      addon = "group_id=#{ @groupid }"
      # group_urlname
    elsif urlname
      addon = "group_urlname=#{ @urlname }"
      # venue_id
    elsif venueid
      addon = "venue_id=#{ @venueid }"
    else
      # None Selected, raise an error
      raise "Configuration error! -  Must have one of `urlname`, `venue_id`, or `group_id` defined"
      addon = ""
    end

    @url = "https://api.meetup.com/2/events.json?key=#{ @meetupkey.value }&status=#{ @eventstatus }&#{ addon }"
  end

  @logger.info("Registering meetup Input", :url => @url.gsub(@meetupkey.value, "xxxx"), :interval => @interval)
end
run(queue) click to toggle source
# File lib/logstash/inputs/meetup.rb, line 68
def run(queue)
  Stud.interval(@interval*60) do
    start = Time.now
    @logger.info? && @logger.info("Polling meetup", :url => @url)

    # Pull down the RSS feed using FTW so we can make use of future cache functions
    response = Faraday.get @url
    logger.error("Error call meetup API: " + response.body) unless response.status.eql?(200)
    begin
      result = LogStash::Json.load(response.body)
    rescue LogStash::Json::ParserError => e
      # ignore json parsing errors
      logger.debug("Error parsing Json", :message => e.message, :backtrace => e.backtrace)
    end

    result["results"].each do |rawevent|
      # handling MU's "relevant" but not matching results
      if text
        next if rawevent['description'].nil? 
        next unless rawevent['description'].downcase.include? @text.downcase
      end
      
      event = LogStash::Event.new(rawevent)
      # Convert the timestamps into Ruby times
      event.set('created', LogStash::Timestamp.at(event.get('created') / 1000, (event.get('created') % 1000) * 1000))
      event.set('time', LogStash::Timestamp.at(event.get('time') / 1000, (event.get('time') % 1000) * 1000))
      event.set('[group][created]', LogStash::Timestamp.at(event.get('group][created]') / 1000, (event.get('group][created]') % 1000) * 1000))
      event.set('updated', LogStash::Timestamp.at(event.get('updated') / 1000, (event.get('updated') % 1000) * 1000))
      event.set('[venue][lonlat]', [event.get('[venue][lon]'), event.get('[venue][lat]')]) if rawevent.has_key?('venue')
      event.set('[group][lonlat]', [event.get('[group][group_lon]'), event.get('[group][group_lat]')]) if rawevent.has_key?('group')
      event.set('[rating][average]', event.get('[rating][average]').round) if rawevent.has_key?('rating')       
      decorate(event)
      queue << event
    end

    duration = Time.now - start
    @logger.info? && @logger.info("poll completed", :command => @command,
                                  :duration => duration)
  end # loop
end