diff --git a/lib/membrane/bin.ex b/lib/membrane/bin.ex index 50bae12f9..37174fe63 100644 --- a/lib/membrane/bin.ex +++ b/lib/membrane/bin.ex @@ -348,6 +348,10 @@ defmodule Membrane.Bin do Membrane.Core.Child.PadsSpecs.ensure_default_membrane_pads() + @doc false + @spec membrane_component_type() :: :pipeline | :bin | :element + def membrane_component_type, do: :bin + @doc false @spec membrane_bin?() :: true def membrane_bin?, do: true diff --git a/lib/membrane/core/callback_handler.ex b/lib/membrane/core/callback_handler.ex index 731f2777a..7ca0a5238 100644 --- a/lib/membrane/core/callback_handler.ex +++ b/lib/membrane/core/callback_handler.ex @@ -136,7 +136,22 @@ defmodule Membrane.Core.CallbackHandler do callback_result = try do - apply(module, callback, args) + telemetry_metadata = %{ + callback_args: args, + component_state: state + } + + :telemetry.execute([:membrane, callback, :start], %{}, telemetry_metadata) + + {duration, result} = :timer.tc(module, callback, args) + + :telemetry.execute( + [:membrane, callback, :stop], + %{duration: duration}, + telemetry_metadata + ) + + result rescue e in UndefinedFunctionError -> _ignored = diff --git a/lib/membrane/core/parent/child_life_controller.ex b/lib/membrane/core/parent/child_life_controller.ex index dd585bf97..4c06f603a 100644 --- a/lib/membrane/core/parent/child_life_controller.ex +++ b/lib/membrane/core/parent/child_life_controller.ex @@ -333,7 +333,14 @@ defmodule Membrane.Core.Parent.ChildLifeController do end) end - do_proceed_spec_startup(spec_ref, %{spec_data | status: :initializing}, state) + spec_data = %{spec_data | status: :initializing} + + :telemetry.execute([:membrane, :spec, :initializing], %{}, %{ + spec_data: spec_data, + component_state: state + }) + + do_proceed_spec_startup(spec_ref, spec_data, state) end defp do_proceed_spec_startup(spec_ref, %{status: :initializing} = spec_data, state) do @@ -346,7 +353,14 @@ defmodule Membrane.Core.Parent.ChildLifeController do Membrane.Logger.debug("Spec #{inspect(spec_ref)} status changed to initialized") state = handle_children_setup_completed(spec_data.children_names, state) - do_proceed_spec_startup(spec_ref, %{spec_data | status: :initialized}, state) + spec_data = %{spec_data | status: :initialized} + + :telemetry.execute([:membrane, :spec, :initialized], %{}, %{ + spec_data: spec_data, + component_state: state + }) + + do_proceed_spec_startup(spec_ref, spec_data, state) else {spec_data, state} end @@ -374,6 +388,12 @@ defmodule Membrane.Core.Parent.ChildLifeController do } Membrane.Logger.debug("Spec #{inspect(spec_ref)} status changed to linking internally") + + :telemetry.execute([:membrane, :spec, :linking_internally], %{}, %{ + spec_data: spec_data, + component_state: state + }) + do_proceed_spec_startup(spec_ref, spec_data, state) end @@ -385,7 +405,15 @@ defmodule Membrane.Core.Parent.ChildLifeController do |> Enum.reduce(state, &LinkUtils.link/2) Membrane.Logger.debug("Spec #{inspect(spec_ref)} status changed to linked internally") - do_proceed_spec_startup(spec_ref, %{spec_data | status: :linked_internally}, state) + + spec_data = %{spec_data | status: :linked_internally} + + :telemetry.execute([:membrane, :spec, :linked_internally], %{}, %{ + spec_data: spec_data, + component_state: state + }) + + do_proceed_spec_startup(spec_ref, spec_data, state) else {spec_data, state} end @@ -398,7 +426,14 @@ defmodule Membrane.Core.Parent.ChildLifeController do ) do Membrane.Logger.debug("Spec #{inspect(spec_ref)} status changed to ready") state = remove_spec_from_dependencies(spec_ref, state) - do_proceed_spec_startup(spec_ref, %{spec_data | status: :ready}, state) + spec_data = %{spec_data | status: :ready} + + :telemetry.execute([:membrane, :spec, :ready], %{}, %{ + spec_data: spec_data, + component_state: state + }) + + do_proceed_spec_startup(spec_ref, spec_data, state) end defp do_proceed_spec_startup( @@ -409,7 +444,14 @@ defmodule Membrane.Core.Parent.ChildLifeController do state = Bin.PadController.respond_links(spec_ref, state) state = remove_spec_from_dependencies(spec_ref, state) Membrane.Logger.debug("Spec #{inspect(spec_ref)} status changed to linking externally") - do_proceed_spec_startup(spec_ref, %{spec_data | status: :linking_externally}, state) + spec_data = %{spec_data | status: :linking_externally} + + :telemetry.execute([:membrane, :spec, :linking_externally], %{}, %{ + spec_data: spec_data, + component_state: state + }) + + do_proceed_spec_startup(spec_ref, spec_data, state) end defp do_proceed_spec_startup( @@ -419,7 +461,14 @@ defmodule Membrane.Core.Parent.ChildLifeController do ) do if Bin.PadController.all_pads_linked?(spec_ref, state) do Membrane.Logger.debug("Spec #{inspect(spec_ref)} status changed to ready") - do_proceed_spec_startup(spec_ref, %{spec_data | status: :ready}, state) + spec_data = %{spec_data | status: :ready} + + :telemetry.execute([:membrane, :spec, :ready], %{}, %{ + spec_data: spec_data, + component_state: state + }) + + do_proceed_spec_startup(spec_ref, spec_data, state) else {spec_data, state} end diff --git a/lib/membrane/core/pipeline.ex b/lib/membrane/core/pipeline.ex index 6f9fc95db..9e8373283 100644 --- a/lib/membrane/core/pipeline.ex +++ b/lib/membrane/core/pipeline.ex @@ -57,6 +57,7 @@ defmodule Membrane.Core.Pipeline do state = %State{ module: params.module, + name: params.name, synchronization: %{ clock_proxy: clock_proxy, clock_provider: %{clock: nil, provider: nil}, diff --git a/lib/membrane/core/pipeline/state.ex b/lib/membrane/core/pipeline/state.ex index 37f24ea2d..c3bf0082a 100644 --- a/lib/membrane/core/pipeline/state.ex +++ b/lib/membrane/core/pipeline/state.ex @@ -14,6 +14,7 @@ defmodule Membrane.Core.Pipeline.State do @type t :: %__MODULE__{ module: module, + name: term(), playback: Membrane.Playback.t(), internal_state: Membrane.Pipeline.state() | nil, children: ChildrenModel.children(), @@ -45,6 +46,7 @@ defmodule Membrane.Core.Pipeline.State do # importance and possibly near other related fields. defstruct module: nil, + name: nil, playback: :stopped, internal_state: nil, children: %{}, diff --git a/lib/membrane/element/base.ex b/lib/membrane/element/base.ex index de0aab632..506d4e413 100644 --- a/lib/membrane/element/base.ex +++ b/lib/membrane/element/base.ex @@ -263,6 +263,10 @@ defmodule Membrane.Element.Base do unquote(bring_pad) + @doc false + @spec membrane_component_type() :: :pipeline | :bin | :element + def membrane_component_type, do: :element + @doc false @spec membrane_element?() :: true def membrane_element?, do: true diff --git a/lib/membrane/pipeline.ex b/lib/membrane/pipeline.ex index 8d32a709d..32fdb8bc0 100644 --- a/lib/membrane/pipeline.ex +++ b/lib/membrane/pipeline.ex @@ -323,6 +323,7 @@ defmodule Membrane.Pipeline do name = case Keyword.fetch(process_options, :name) do {:ok, name} when is_atom(name) -> Atom.to_string(name) + {:ok, {:via, Registry, {_registry, name}}} -> name _other -> nil end |> case do @@ -512,6 +513,10 @@ defmodule Membrane.Pipeline do } end + @doc false + @spec membrane_component_type() :: :pipeline | :bin | :element + def membrane_component_type, do: :pipeline + @doc false @spec membrane_pipeline?() :: true def membrane_pipeline?, do: true