Current section
Files
Jump to
Current section
Files
lib/tracer.ex
defmodule Tracer do
@moduledoc """
**Tracer** is a tracing framework for elixir which features an easy to use high level interface, extensibility and safety for using in production.
To run a tool use the `run` command. Tracing only happens when the tool is running.
All tools accept the following parameters:
* `node: node_name` - Option to run the tool remotely.
* `max_tracing_time: time` - Maximum time to run tool (30sec).
* `max_message_count: count` - Maximum number of events (1000)
* `max_queue_size: size` - Maximum message queue size (1000)
* `process: pid` - Process to trace, also accepts regigered names,
and :all, :existing, :new
* `forward_pid: pid` - Forward results as messages insted of printing
to the display.
## Examples
```
iex> run Count, process: self(), match: global String.split(string, pattern)
:ok
iex> String.split("Hello World", " ")
["Hello", "World"]
iex> String.split("Hello World", " ")
["Hello", "World"]
iex String.split("Hello World", "o")
["Hell", " W", "rld"]
iex> String.split("Hello", "o")
["Hell", ""]
iex> stop
:ok
1 [string:"Hello World", pattern:"o"]
1 [string:"Hello" , pattern:"o" ]
2 [string:"Hello World", pattern:" "]
```
"""
alias Tracer.{Server, Probe, Tool}
import Tracer.Macros
defmacro __using__(_opts) do
quote do
import Tracer
import Tracer.Matcher
alias Tracer.{Tool, Probe, Clause}
alias Tracer.Tool.{Display, Count, CallSeq, Duration, FlameGraph}
:ok
end
end
delegate :start_server, to: Server, as: :start
delegate :stop_server, to: Server, as: :stop
delegate :stop, to: Server, as: :stop_tool
delegate_1 :set_tool, to: Server, as: :set_tool
def probe(params) do
Probe.new(params)
end
def probe(type, params) do
Probe.new([type: type] ++ params)
end
def tool(type, params) do
Tool.new(type, params)
end
@doc """
Runs a tool. Tracing only happens when the tool is running.
* `tool_name` - The name of the tool that want to run.
* `node: node_name` - Option to run the tool remotely.
* `max_tracing_time: time` - Maximum time to run tool (30sec).
* `max_message_count: count` - Maximum number of events (1000)
* `max_queue_size: size` - Maximum message queue size (1000)
* `process: pid` - Process to trace, also accepts regigered names,
and :all, :existing, :new
* `forward_pid: pid` - Forward results as messages insted of printing
to the display.
## Examples
```
iex> run Count, process: self(), match: global String.split(string, pattern)
:ok
iex> String.split("Hello World", " ")
["Hello", "World"]
iex> String.split("Hello World", " ")
["Hello", "World"]
iex> String.split("Hello World", "o")
["Hell", " W", "rld"]
iex> String.split("Hello", "o")
["Hell", ""]
iex> stop
:ok
1 [string:"Hello World", pattern:"o"]
1 [string:"Hello" , pattern:"o" ]
2 [string:"Hello World", pattern:" "]
```
"""
def run(%{"__tool__": _} = tool) do
Server.start_tool(tool)
end
def run(tool_name, params) do
Server.start_tool(tool(tool_name, params))
end
end