File: server.rb

package info (click to toggle)
gitlab 17.6.5-19
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 629,368 kB
  • sloc: ruby: 1,915,304; javascript: 557,307; sql: 60,639; xml: 6,509; sh: 4,567; makefile: 1,239; python: 406
file content (71 lines) | stat: -rw-r--r-- 1,627 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# frozen_string_literal: true

require 'webrick'
require 'json'
require 'base64'

class Server
  attr_accessor :events

  def initialize
    port = Gitlab::Tracking::Destinations::SnowplowMicro.new.uri.port
    @server = WEBrick::HTTPServer.new Port: port,
      Logger: WEBrick::Log.new(nil, WEBrick::BasicLog::ERROR),
      RequestCallback: ->(_req, res) {
        res.header['Access-Control-Allow-Credentials'] = 'true'
        res.header['Access-Control-Allow-Headers'] = 'Content-Type'
        res.header['Access-Control-Allow-Origin'] = Gitlab.config.gitlab.url
      }

    trap 'INT' do
      @server.shutdown
    end

    @events = []
  end

  def start
    @server.mount_proc '/i' do |req, res|
      @events << extract_event(req.query)
      res.status = 200
    end

    @server.mount_proc '/com.snowplowanalytics.snowplow/tp2' do |req, res|
      JSON.parse(req.body)['data'].each do |query|
        next unless query['e'] == "se"

        @events << extract_event(query)
      end

      res.status = 200
    end

    @server.mount_proc '/micro/good' do |_req, res|
      res.status = 200
      res.body = JSON.dump(@events)
    end

    @server.start
  end

  def stop
    @server.shutdown
  end

  private

  def extract_event(query)
    {
      event: {
        se_category: query['se_ca'],
        se_action: query['se_ac'],
        collector_tstamp: query['dtm'],
        se_label: query['se_la'],
        se_property: query['se_pr'],
        se_value: query['se_va'],
        contexts: (JSON.parse(Base64.decode64(query['cx'])) if query['cx'])
      },
      rawEvent: { parameters: query }
    }
  end
end