Skip to content

Instantly share code, notes, and snippets.

@robwierzbowski
Last active December 7, 2021 20:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save robwierzbowski/e2c8a1ff71a8582ddf1d769d895ccde7 to your computer and use it in GitHub Desktop.
Save robwierzbowski/e2c8a1ff71a8582ddf1d769d895ccde7 to your computer and use it in GitHub Desktop.
# frozen_string_literal: true
# Collector for v2 "atomic" events. This is currently a bare-minimum implementation
# for v2 event steel-threads. These events should not yet be used for any production
# data processing.
class Api::V2::EventsCollectorController < Api::ApiController
# Client-auth data is being used to add client-id to our event payloads
include StitchFix::ClientFacingAuth::ControllerHelpers
include StitchFix::Logger::Logging
ROUTING_KEY = "algo.product_tracking.v2_test_event"
def create
events = if params[:events].present?
params.require(:events).map { |e| e.permit! }
else
[params.require(:event).permit!]
end
invalid_events = []
events.each do |event|
if !validate_event(event)
# For now we are just logging invalid events - eventually we will stop
# sending them to algos
log_invalid_event(event)
invalid_events.push(event)
end
enriched_event = enrich_event(event)
forward_event_to_data_warehouse(enriched_event)
log_metric(enriched_event)
end
if invalid_events.empty?
head :no_content
else
render json: {invalid_events: invalid_events}, status: :unprocessable_entity
end
end
private
def enrich_event(event)
event.merge(
client_id: authenticated_client&.id
)
end
def validate_event(event)
::EventsV2::Validator.valid?(event)
end
def forward_event_to_data_warehouse(event)
StitchFix::Messaging::Transmitter.send_message_async(
event.to_h,
ROUTING_KEY,
transport: StitchFix::Messaging::Transport::AlgosOnRamp
)
end
def log_metric(event)
$stats.count(
"client.event.v2",
tags: {
schema: event[:schema]
}
)
end
def log_invalid_event(event)
tags = {
source_app: event.dig(:screen_view, :source_app),
schema: event.dig(:schema)
}
info("Invalid event", tags.merge({event: event}))
$stats.count("client.event.v2.invalid", tags: tags)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment