View Source Datadog.Sketch.Store.Dense (Data Streams Ex v1.2.2)

The Dense store is a dynamically growing contiguous (non-sparse) store. The number of bins are bound only by the size of the :array that can be allocated.

Summary

Functions

Adds a number to the store.

Adds a bin type to the store.

Adds multiple bin types to the store.

Adds a number to the store count number of times.

Checks if the store has any information in it.

Return the key for the value at rank.

Returns the maximum index of the store.

Returns the minimum index of the store.

Creates a new dense store.

Maps over all values and multiplies by the given weight.

Returns a struct for Protobuf encoding. Used for sending data to Datadog.

Returns the total amount of counts stored.

Types

@type t() :: %Datadog.Sketch.Store.Dense{
  bins: :array.array(),
  count: float(),
  max_index: integer(),
  min_index: integer(),
  offset: integer()
}

Functions

@spec add(t(), integer()) :: t()

Adds a number to the store.

Examples

  iex> %Dense{} = Dense.add(Dense.new(), 100)
@spec add_bin(t(), Datadog.Sketch.Store.bin()) :: t()

Adds a bin type to the store.

Examples

  iex> %Dense{} = Dense.add_bin(Dense.new(), %{index: 100, count: 13.13})
@spec add_bins(t(), [Datadog.Sketch.Store.bin()]) :: t()

Adds multiple bin types to the store.

Examples

  iex> %Dense{} = Dense.add_bins(Dense.new(), [
  ...>   %{index: 100, count: 13.13},
  ...>   %{index: 20, count: 2342.4}
  ...> ])
Link to this function

add_with_count(store, index, count)

View Source
@spec add_with_count(t(), integer(), float()) :: t()

Adds a number to the store count number of times.

Examples

  iex> %Dense{} = Dense.add_with_count(Dense.new(), 100, 13.13)

  iex> %Dense{} = Dense.add_with_count(Dense.new(), 987, 8.3e12)
@spec empty?(t()) :: bool()

Checks if the store has any information in it.

Examples

  iex> store = Dense.new()
  ...> Dense.empty?(store)
  true

  iex> store = Dense.add(Dense.new(), 754)
  ...> Dense.empty?(store)
  false
Link to this function

key_at_rank(store, rank)

View Source
@spec key_at_rank(t(), float()) :: integer()

Return the key for the value at rank.

Examples

  # Matches the golang implementation when no data is present.
  iex> store = Dense.new()
  ...> Dense.key_at_rank(store, 0.0)
  -134_217_729

  # Verified matching to golang implementation
  iex> store = Dense.add(Dense.new(), 128)
  ...> Dense.key_at_rank(store, 0.0)
  128

  # Verified matching to golang implementation
  iex> store = Dense.add_bins(Dense.new(), [
  ...>   %{index: 12, count: 423.43},
  ...>   %{index: 244, count: 1238.123},
  ...>   %{index: 124, count: 2184.124}
  ...> ])
  ...> Dense.key_at_rank(store, 64.0)
  12
@spec max_index(t()) :: integer()

Returns the maximum index of the store.

Examples

  iex> store = Dense.new()
  ...> Dense.max_index(store)
  0

  iex> store = Dense.add(Dense.new(), 128)
  ...> Dense.max_index(store)
  128

  # Verified against golang implementation
  iex> store = Dense.add_bins(Dense.new(), [
  ...>   %{index: 4, count: 12.48},
  ...>   %{index: 65, count: 12.48},
  ...>   %{index: 37, count: 847.4}
  ...> ])
  ...> Dense.max_index(store)
  65
@spec min_index(t()) :: integer()

Returns the minimum index of the store.

Examples

  iex> store = Dense.new()
  ...> Dense.min_index(store)
  0

  # Verified against golang implementation
  iex> store = Dense.add_bins(Dense.new(), [
  ...>   %{index: 4, count: 12.48},
  ...>   %{index: 65, count: 12.48},
  ...>   %{index: 37, count: 847.4}
  ...> ])
  ...> Dense.min_index(store)
  4
@spec new() :: t()

Creates a new dense store.

Examples

  iex> Dense.new()
  %Dense{}
@spec reweight(t(), float()) :: t()

Maps over all values and multiplies by the given weight.

Examples

  # Verified matching to golang implementation
  iex> store = Dense.add_bins(Dense.new(), [
  ...>   %{index: 4, count: 10.0},
  ...>   %{index: 2, count: 20.0},
  ...>   %{index: 6, count: 30.0}
  ...> ])
  ...> store = Dense.reweight(store, 2)
  ...> Dense.total_count(store)
  120.0
@spec to_proto(t()) :: Datadog.Sketch.Protobuf.Store.t()

Returns a struct for Protobuf encoding. Used for sending data to Datadog.

Examples

  # Verified matching to golang implementation
  iex> store = Dense.add(Dense.new(), 4)
  ...> Dense.to_proto(store)
  %Datadog.Sketch.Protobuf.Store{
    binCounts: %{},
    contiguousBinCounts: [1.0],
    contiguousBinIndexOffset: 4
  }

  # Verified matching to golang implementation
  iex> store = Dense.add_bins(Dense.new(), [
  ...>   %{index: 4, count: 12.48},
  ...>   %{index: 65, count: 12.48},
  ...>   %{index: 37, count: 847.4}
  ...> ])
  ...> Dense.to_proto(store)
  %Datadog.Sketch.Protobuf.Store{
    binCounts: %{},
    contiguousBinCounts: [12.48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 847.4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12.48],
    contiguousBinIndexOffset: 4
  }
@spec total_count(t()) :: float()

Returns the total amount of counts stored.

Examples

  iex> store = Dense.new()
  ...> Dense.total_count(store)
  0.0

  iex> store = Dense.add(Dense.new(), 754)
  ...> Dense.total_count(store)
  1.0

  iex> store = Dense.add_with_count(Dense.new(), 754, 42.42)
  ...> Dense.total_count(store)
  42.42

  # Verified against golang implementation
  iex> store = Dense.add_bins(Dense.new(), [
  ...>   %{index: 4, count: 12.48},
  ...>   %{index: 65, count: 12.48},
  ...>   %{index: 37, count: 847.4}
  ...> ])
  ...> Dense.total_count(store)
  872.36