Class: StatsCloud::StatsmeterClient

Inherits:
Object
  • Object
show all
Includes:
EventHelper, LoggerHelper, SocketIOHelper, StatsmeterHelper
Defined in:
lib/statscloud/statsmeter_client.rb

Overview

Client for Statsmeter.

Constant Summary collapse

BINARY_BUFFER_SIZE =

Maximum size of pending binary events buffer.

1024
PLAIN_BUFFER_SIZE =

Maximum size of pending binary events buffer.

1024 * 100

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from LoggerHelper

#logger

Constructor Details

#initialize(url, token, tags = []) ⇒ StatsmeterClient

Initialize statsmeter client.

Parameters:

  • url (+String+)

    statsmeter url.

  • token (+String+)

    authorization token.



52
53
54
55
56
57
# File 'lib/statscloud/statsmeter_client.rb', line 52

def initialize(url, token, tags = [])
  set_config(url, token, tags)
  set_client_to_nil
  set_pending_values
  set_socket_values
end

Instance Attribute Details

#clientObject

Socket connection with statscloud cluster which is used to record events.

Type: SocketIO::Client::Simple



34
35
36
# File 'lib/statscloud/statsmeter_client.rb', line 34

def client
  @client
end

#event_name_size_in_bytesObject

Binary size for metric names.

Type: Integer



44
45
46
# File 'lib/statscloud/statsmeter_client.rb', line 44

def event_name_size_in_bytes
  @event_name_size_in_bytes
end

#names_mapObject

Metric names.

Type: Hash



39
40
41
# File 'lib/statscloud/statsmeter_client.rb', line 39

def names_map
  @names_map
end

#urlObject (readonly)

Statsmeter cluster url is used to connect to cluster.

Type: String



29
30
31
# File 'lib/statscloud/statsmeter_client.rb', line 29

def url
  @url
end

Instance Method Details

#closeObject

Stops socket.io connection.



130
131
132
133
# File 'lib/statscloud/statsmeter_client.rb', line 130

def close
  client.disconnect if open?
  set_client_to_nil
end

#connectObject

Connects to the server and starts periodic sending events.



60
61
62
63
64
65
# File 'lib/statscloud/statsmeter_client.rb', line 60

def connect
  Thread.new do
    connect_client(@url, @token)
    flush_events_loop.join if @client
  end
end

#connected?Boolean

Shows statsmeter state.

Returns:

  • (Boolean)


125
126
127
# File 'lib/statscloud/statsmeter_client.rb', line 125

def connected?
  @client&.state == :connect
end

#flush_eventsObject

Sends all pending events to statscloud.



111
112
113
114
115
116
117
118
119
120
121
122
# File 'lib/statscloud/statsmeter_client.rb', line 111

def flush_events
  return if @pending_binary_offset.zero?
  checksum = crc32.calculate(@pending_plain_events.buffer, @pending_plain_offset, 0)
  return if checksum.zero?
  @pending_binary_events.writeInt32BE(checksum, @pending_binary_offset)
  send_message @pending_binary_events
  set_pending_values
rescue StandardError => error
  logger.error error
  close
  connect.join
end

#record_event(name, measurement = 0) ⇒ Object

Records a single event.

Save event in pending events.

Parameters:

  • name (+String+)

    name of the event to record.

  • measurement (+Integer+) (defaults to: 0)

    optional measurement, depending on metrics type.



75
76
77
# File 'lib/statscloud/statsmeter_client.rb', line 75

def record_event(name, measurement = 0)
  record_events(name: name, measurement: measurement)
end

#record_events(*events) ⇒ Object

Records several events at once.

Save events in pending events.

Parameters:

  • events (+Array+)

    events to send (each should have name and optional measurement fields).



85
86
87
# File 'lib/statscloud/statsmeter_client.rb', line 85

def record_events(*events)
  record_events_array(events)
end

#record_events_array(events) ⇒ Object

Records an array of events at once.

Save events in pending binary and plain arrays. Check flush condition.

Parameters:

  • events (+Array+)

    array of events to send (each shoud have name and optional measurement fields).



95
96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'lib/statscloud/statsmeter_client.rb', line 95

def record_events_array(events)
  events.each do |event|
    name = get_event_name(event)
    measurement = get_event_measurement(event)&.to_f

    next unless @names_map && @names_map[name]
    binary_length = get_binary_length(@event_name_size_in_bytes)
    plain_length = get_plain_length(name, measurement)

    flush_events if flush_condition(binary_length, plain_length)
    record_binary_event(name, measurement, binary_length)
    record_plain_event(name, measurement, plain_length)
  end
end