Skip to content
This repository has been archived by the owner on Apr 9, 2024. It is now read-only.

[RTC-94] Include SDP Offer and Answer in metrics #106

Merged
merged 1 commit into from
Mar 8, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 26 additions & 1 deletion lib/membrane_webrtc_plugin/endpoint_bin.ex
Original file line number Diff line number Diff line change
Expand Up @@ -17,19 +17,25 @@ defmodule Membrane.WebRTC.EndpointBin do
require Membrane.Logger
require Membrane.OpenTelemetry

require Membrane.TelemetryMetrics

alias __MODULE__.TracksState
alias ExSDP.Media
alias ExSDP.Attribute.{FMTP, RTPMapping}
alias Membrane.ICE
alias Membrane.RTP
alias Membrane.WebRTC.{Extension, SDP, Track}
alias Membrane.WebRTC.Utils

# we always want to use ICE lite at the moment
@ice_lite true

@life_span_id "endpoint_bin.life_span"
@ice_restart_span_id "endpoint_bin.ice_restart"

@sdp_offer_event [Membrane.WebRTC, :sdp, :offer]
@sdp_answer_event [Membrane.WebRTC, :sdp, :answer]

@type new_track_notification ::
{:new_track, Track.id(), nil | Track.rid(), RTP.ssrc_t(), Track.encoding_key(),
depayloading_filter :: module()}
Expand Down Expand Up @@ -231,6 +237,9 @@ defmodule Membrane.WebRTC.EndpointBin do

@impl true
def handle_init(_ctx, %__MODULE__{} = opts) do
Membrane.TelemetryMetrics.register(@sdp_offer_event, opts.telemetry_label)
Membrane.TelemetryMetrics.register(@sdp_answer_event, opts.telemetry_label)

trace_metadata =
Keyword.merge(opts.trace_metadata, [
{:"library.language", :erlang},
Expand Down Expand Up @@ -551,6 +560,13 @@ defmodule Membrane.WebRTC.EndpointBin do

@impl true
def handle_parent_notification({:signal, {:sdp_offer, raw_sdp, mid_to_track_id}}, _ctx, state) do
Membrane.TelemetryMetrics.execute(
@sdp_offer_event,
%{sdp: Utils.anonymize_sdp(raw_sdp)},
%{},
state.telemetry_label
)

Membrane.OpenTelemetry.add_event(@ice_restart_span_id, :sdp_offer, sdp: raw_sdp)

sdp = ExSDP.parse!(raw_sdp)
Expand Down Expand Up @@ -611,9 +627,18 @@ defmodule Membrane.WebRTC.EndpointBin do
do: actions,
else: actions ++ [notify_parent: {:removed_tracks, removed_inbound_tracks}]

answer_str = to_string(answer)

Membrane.TelemetryMetrics.execute(
@sdp_answer_event,
%{sdp: Utils.anonymize_sdp(answer_str)},
%{},
state.telemetry_label
)

actions =
new_actions ++
[notify_parent: {:signal, {:sdp_answer, to_string(answer), mid_to_track_id}}] ++
[notify_parent: {:signal, {:sdp_answer, answer_str, mid_to_track_id}}] ++
set_remote_credentials(sdp) ++
actions

Expand Down
22 changes: 22 additions & 0 deletions lib/membrane_webrtc_plugin/metrics.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
defmodule Membrane.WebRTC.Metrics do
@moduledoc """
Defines a list of metrics that can be aggregated based on events from `membrane_webrtc_plugin`.
"""

alias Telemetry.Metrics

@spec metrics() :: [Metrics.t()]
def metrics(),
do: [
Metrics.last_value(
"sdp.offer",
event_name: [Membrane.WebRTC, :sdp, :offer],
measurement: :sdp
),
Metrics.last_value(
"sdp.answer",
event_name: [Membrane.WebRTC, :sdp, :answer],
measurement: :sdp
)
]
end
Empty file.
5 changes: 5 additions & 0 deletions lib/membrane_webrtc_plugin/utils.ex
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,9 @@ defmodule Membrane.WebRTC.Utils do
x -> to_string(x)
end
end

@spec anonymize_sdp(String.t()) :: String.t()
def anonymize_sdp(sdp) do
Regex.replace(~r/(ice-ufrag|fingerprint|ice-pwd):.*\n/, sdp, "\\1:****\n")
end
end