Class: Wavefront::Write

Inherits:
Object
  • Object
show all
Includes:
Validators
Defined in:
lib/wavefront-sdk/write.rb

Overview

This class helps you send points to Wavefront. It is extended by the Write and Report classes, which respectively handle point ingestion by a proxy and directly to the API.

Direct Known Subclasses

Distribution, Report

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Validators

#wf_alert_id?, #wf_alert_severity?, #wf_cloudintegration_id?, #wf_dashboard_id?, #wf_derivedmetric_id?, #wf_distribution?, #wf_distribution_count?, #wf_distribution_interval?, #wf_distribution_values?, #wf_epoch?, #wf_event_id?, #wf_granularity?, #wf_integration_id?, #wf_link_id?, #wf_link_template?, #wf_maintenance_window_id?, #wf_message_id?, #wf_metric_name?, #wf_ms_ts?, #wf_name?, #wf_notificant_id?, #wf_point?, #wf_point_tag?, #wf_point_tags?, #wf_proxy_id?, #wf_savedsearch_entity?, #wf_savedsearch_id?, #wf_source_id?, #wf_string?, #wf_tag?, #wf_ts?, #wf_user_id?, #wf_value?, #wf_version?, #wf_webhook_id?

Constructor Details

#initialize(creds = {}, opts = {}) ⇒ Write

Construct an object which gives the user an interface for writing points to Wavefront. The actual writing is handled by

a Wavefront::Writer

subclass.

Parameters:

  • creds (Hash) (defaults to: {})

    credentials signature.

  • options (Hash)

    can contain the following keys: proxy [String] the address of the Wavefront proxy. (‘wavefront’) port [Integer] the port of the Wavefront proxy tags [Hash] point tags which will be applied to every point noop [Bool] if true, no proxy connection will be made, and

    instead of sending the points, they will be printed in
    Wavefront wire format.
    

    novalidate [Bool] if true, points will not be validated.

    This might make things go marginally quicker if you have
    done point validation higher up in the chain. Invalid
    points are dropped, logged, and reported in the summary.
    

    verbose [Bool] debug [Bool] writer [Symbol, String] the name of the writer class to use.

    Defaults to :socket
    


44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/wavefront-sdk/write.rb', line 44

def initialize(creds = {}, opts = {})
  defaults = { tags:       nil,
               writer:     :socket,
               noop:       false,
               novalidate: false,
               verbose:    false,
               debug:      false }

  @opts = setup_options(opts, defaults)
  @creds = creds
  wf_point_tags?(opts[:tags]) if opts[:tags]
  @logger = Wavefront::Logger.new(opts)
  @writer = setup_writer
end

Instance Attribute Details

#credsObject (readonly)

Returns the value of attribute creds.



18
19
20
# File 'lib/wavefront-sdk/write.rb', line 18

def creds
  @creds
end

#loggerObject (readonly)

Returns the value of attribute logger.



18
19
20
# File 'lib/wavefront-sdk/write.rb', line 18

def logger
  @logger
end

#optsObject (readonly)

Returns the value of attribute opts.



18
19
20
# File 'lib/wavefront-sdk/write.rb', line 18

def opts
  @opts
end

#writerObject (readonly)

Returns the value of attribute writer.



18
19
20
# File 'lib/wavefront-sdk/write.rb', line 18

def writer
  @writer
end

Instance Method Details

#closeObject

Wrapper to the writer class’s #close method.



72
73
74
# File 'lib/wavefront-sdk/write.rb', line 72

def close
  writer.close
end

#hash_to_wf(point) ⇒ Object

Convert a validated point to a string conforming to community.wavefront.com/docs/DOC-1031. No validation is done here.

Parameters:

  • point (Hash)

    a hash describing a point. See #write() for the format.



157
158
159
160
161
162
# File 'lib/wavefront-sdk/write.rb', line 157

def hash_to_wf(point)
  format('%s %s %s source=%s %s %s',
         *point_array(point)).squeeze(' ').strip
rescue StandardError
  raise Wavefront::Exception::InvalidPoint
end

#openObject

Wrapper to the writer class’s #open method. Using this you can manually open a connection and re-use it.



66
67
68
# File 'lib/wavefront-sdk/write.rb', line 66

def open
  writer.open
end

#paths_to_deltas(points) ⇒ Array[Hash]

Prefix all paths in a points array (as passed to #write_delta() with a delta symbol

Parameters:

Returns:



104
105
106
# File 'lib/wavefront-sdk/write.rb', line 104

def paths_to_deltas(points)
  [points].flatten.map { |p| p.tap { p[:path] = DELTA + p[:path] } }
end

#point_array(point) ⇒ Object

Make an array which can be used by #hash_to_wf.

Parameters:

  • point (Hash)

    a hash describing a point. See #write() for the format.

Raises:



169
170
171
172
173
174
175
176
# File 'lib/wavefront-sdk/write.rb', line 169

def point_array(point)
  [point[:path] || raise,
   point[:value] || raise,
   point.fetch(:ts, nil),
   point.fetch(:source, HOSTNAME),
   point[:tags] && point[:tags].to_wf_tag,
   opts[:tags] && opts[:tags].to_wf_tag]
end

#raw(points, openclose = true) ⇒ Object

Send raw data to a Wavefront proxy, optionally automatically opening and closing the connection. (Or not, if that does not make sense in the context of the writer.)

Parameters:

  • points (Array[String])

    an array of points in native Wavefront wire format, as described in community.wavefront.com/docs/DOC-1031. No validation is performed.

  • openclose (Boolean) (defaults to: true)

    whether or not to automatically open a socket to the proxy before sending points, and afterwards, close it.



134
135
136
137
138
139
140
141
142
# File 'lib/wavefront-sdk/write.rb', line 134

def raw(points, openclose = true)
  writer.open if openclose && writer.respond_to?(:open)

  begin
    [points].flatten.each { |p| writer.send_point(p) }
  ensure
    writer.close if openclose && writer.respond_to?(:close)
  end
end

#send_point(point) ⇒ Object

Wrapper for the writer class’s #send_point method

Parameters:

  • point (String)

    a point description, probably from #hash_to_wf()



112
113
114
115
116
117
118
119
120
# File 'lib/wavefront-sdk/write.rb', line 112

def send_point(point)
  if opts[:noop]
    logger.log "Would send: #{point}"
    return
  end

  logger.log("Sending: #{point}", :debug)
  writer.send_point(point)
end

#setup_options(user, defaults) ⇒ Object



59
60
61
# File 'lib/wavefront-sdk/write.rb', line 59

def setup_options(user, defaults)
  defaults.merge(user)
end

#validationObject

The method used to validate the data we wish to write.



146
147
148
# File 'lib/wavefront-sdk/write.rb', line 146

def validation
  :wf_point?
end

#write(points = [], openclose = true, prefix = nil) ⇒ Object

A wrapper to the writer class’s #write method. Writers implement this method differently, Check the appropriate class documentation for @return information etc. The signature is always the same.



81
82
83
# File 'lib/wavefront-sdk/write.rb', line 81

def write(points = [], openclose = true, prefix = nil)
  writer.write(points, openclose, prefix)
end

#write_delta(points, openclose = true) ⇒ Object

A wrapper method around #write() which guarantees all points will be sent as deltas. You can still manually prefix any metric with a delta symbol and use #write(), but depending on your use-case, this method may be safer. It’s easy to forget the delta.

Parameters:

  • points (Array[Hash])

    see #write()

  • openclose (Bool) (defaults to: true)

    see #write()



94
95
96
# File 'lib/wavefront-sdk/write.rb', line 94

def write_delta(points, openclose = true)
  write(paths_to_deltas(points), openclose)
end