Class: AllStak::Modules::Database

Inherits:
Object
  • Object
show all
Defined in:
lib/allstak/modules/database.rb

Overview

Database query telemetry, batched up to 100 per POST.

Constant Summary collapse

PATH =
"/ingest/v1/db".freeze
BATCH_SIZE =
100

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(transport, config, logger) ⇒ Database

Returns a new instance of Database.



10
11
12
13
14
15
16
17
18
19
20
21
# File 'lib/allstak/modules/database.rb', line 10

def initialize(transport, config, logger)
  @transport = transport
  @config = config
  @logger = logger
  @buffer = Transport::FlushBuffer.new(
    name: "database",
    max_size: config.buffer_size,
    interval_ms: config.flush_interval_ms,
    flush_proc: method(:flush_batch),
    logger: logger
  )
end

Class Method Details

.detect_query_type(sql) ⇒ Object



67
68
69
70
# File 'lib/allstak/modules/database.rb', line 67

def self.detect_query_type(sql)
  first = sql.to_s.strip.split(/\s+/, 2).first.to_s.upcase
  %w[SELECT INSERT UPDATE DELETE].include?(first) ? first : "OTHER"
end

.hash_query(normalized) ⇒ Object



63
64
65
# File 'lib/allstak/modules/database.rb', line 63

def self.hash_query(normalized)
  Digest::MD5.hexdigest(normalized)[0, 16]
end

.normalize_query(sql) ⇒ Object



55
56
57
58
59
60
61
# File 'lib/allstak/modules/database.rb', line 55

def self.normalize_query(sql)
  s = sql.to_s.dup
  s.gsub!(/'[^']*'/, "?")
  s.gsub!(/\b\d+(\.\d+)?\b/, "?")
  s.gsub!(/\s+/, " ")
  s.strip
end

Instance Method Details

#flushObject



47
48
49
# File 'lib/allstak/modules/database.rb', line 47

def flush
  @buffer.flush
end

#record(sql:, duration_ms:, status: "success", error_message: nil, database_name: nil, database_type: nil, query_type: nil, rows_affected: -1,, trace_id: nil, span_id: nil) ⇒ Object



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/allstak/modules/database.rb', line 23

def record(sql:, duration_ms:, status: "success", error_message: nil,
           database_name: nil, database_type: nil, query_type: nil,
           rows_affected: -1, trace_id: nil, span_id: nil)
  return if @transport.disabled?
  normalized = self.class.normalize_query(sql)
  @buffer.push({
    normalizedQuery: normalized,
    queryHash: self.class.hash_query(normalized),
    queryType: query_type || self.class.detect_query_type(normalized),
    durationMs: [duration_ms.to_i, 0].max,
    timestampMillis: (Time.now.to_f * 1000).to_i,
    status: status,
    errorMessage: error_message && error_message.to_s[0, 500],
    databaseName: database_name,
    databaseType: database_type,
    service: @config.service_name,
    environment: @config.environment,
    release: @config.respond_to?(:release) ? @config.release : nil,
    traceId: trace_id,
    spanId: span_id,
    rowsAffected: rows_affected
  }.compact)
end

#shutdownObject



51
52
53
# File 'lib/allstak/modules/database.rb', line 51

def shutdown
  @buffer.shutdown
end