Skip to content

Commit

Permalink
Add user info to session metrics (#12)
Browse files Browse the repository at this point in the history
  • Loading branch information
axsuul authored Nov 10, 2023
1 parent fe0c395 commit fafd9df
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 24 deletions.
8 changes: 7 additions & 1 deletion .github/workflows/docker.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ on:
branches:
- '**'
tags:
- 'v*.*.*'
# Must match pattern (e.g. 0.0.1)
- '*.*.*'

jobs:
docker:
Expand Down Expand Up @@ -40,6 +41,11 @@ jobs:
echo 'DOCKER_IMAGE_TAGS<<EOF' >> $GITHUB_ENV
echo "ghcr.io/${{ github.repository }}:${{ github.sha }}" >> $GITHUB_ENV
# Add release tag if it matches pattern (e.g. 0.0.1)
if [[ ${{ github.ref_name }} =~ .+\..+\..+ ]]; then
echo ",ghcr.io/${{ github.repository }}:${{ github.ref_name }}" >> $GITHUB_ENV
fi
# Only add latest tag if master branch
if [[ ${{ github.ref_name }} == 'master' ]]; then
echo ",ghcr.io/${{ github.repository }}:latest" >> $GITHUB_ENV
Expand Down
23 changes: 12 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,23 +44,24 @@ plex_media_count{title="Audiobooks",type="artist"} 17.0
plex_media_count{title="Music",type="artist"} 891.0
# TYPE plex_sessions_count gauge
# HELP plex_sessions_count Number of current sessions
plex_sessions_count{state="buffering"} 0.0
plex_sessions_count{state="paused"} 1.0
plex_sessions_count{state="playing"} 2.0
plex_sessions_count{state="buffering",user_id="3",username="Tarantino"} 1.0
plex_sessions_count{state="paused",user_id="2",username="Scorsese"} 1.0
plex_sessions_count{state="playing",user_id="3",username="Tarantino"} 1.0
plex_sessions_count{state="playing",user_id="1",username="Hitchcock"} 2.0
# TYPE plex_audio_transcode_sessions_count gauge
# HELP plex_audio_transcode_sessions_count Number of current sessions that are transcoding audio
plex_audio_transcode_sessions_count{state="buffering"} 0.0
plex_audio_transcode_sessions_count{state="paused"} 0.0
plex_audio_transcode_sessions_count{state="playing"} 0.0
plex_audio_transcode_sessions_count{state="buffering",user_id="1",username="Hitchcock"} 1.0
plex_audio_transcode_sessions_count{state="paused",user_id="2",username="Scorsese"} 1.0
plex_audio_transcode_sessions_count{state="playing",user_id="3",username="Tarantino"} 1.0
# TYPE plex_video_transcode_sessions_count gauge
# HELP plex_video_transcode_sessions_count Number of current sessions that are transcoding video
plex_video_transcode_sessions_count{state="buffering"} 0.0
plex_video_transcode_sessions_count{state="paused"} 0.0
plex_video_transcode_sessions_count{state="playing"} 1.0
plex_video_transcode_sessions_count{state="buffering",user_id="1",username="Hitchcock"} 1.0
plex_video_transcode_sessions_count{state="paused",user_id="2",username="Scorsese"} 1.0
plex_video_transcode_sessions_count{state="playing",user_id="3",username="Tarantino"} 1.0
# TYPE plex_media_downloads_count gauge
# HELP plex_media_downloads_count Number of current media downloads
plex_media_downloads_count{user_id="1",username="axsuul"} 1.0
plex_media_downloads_count{user_id="2",username="hoarder"} 3.0
plex_media_downloads_count{user_id="1",user_id="1",username="Hitchcock"} 1.0
plex_media_downloads_count{user_id="2",user_id="2",username="Scorsese"} 3.0
```

## Grafana
Expand Down
33 changes: 21 additions & 12 deletions lib/middleware/collector.rb
Original file line number Diff line number Diff line change
Expand Up @@ -34,17 +34,17 @@ def initialize(app)
@metrics[:all_sessions_count] = @registry.gauge(
:"#{@metrics_prefix}_sessions_count",
docstring: "Number of current sessions",
labels: [:state],
labels: [:state, :user_id, :username],
)
@metrics[:audio_transcode_sessions_count] = @registry.gauge(
:"#{@metrics_prefix}_audio_transcode_sessions_count",
docstring: "Number of current sessions that are transcoding audio",
labels: [:state],
labels: [:state, :user_id, :username],
)
@metrics[:video_transcode_sessions_count] = @registry.gauge(
:"#{@metrics_prefix}_video_transcode_sessions_count",
docstring: "Number of current sessions that are transcoding video",
labels: [:state],
labels: [:state, :user_id, :username],
)
@metrics[:media_downloads_count] = @registry.gauge(
:"#{@metrics_prefix}_media_downloads_count",
Expand Down Expand Up @@ -94,11 +94,11 @@ def collect_activity_metrics
next unless activity_resource.dig("type") == "media.download"

# The title will be something like "Media download by user123"
username = activity_resource.dig("title").split(/\s+/).last
user = activity_resource.dig("title").split(/\s+/).last

labels = {
user_id: activity_resource.dig("userID"),
username: username,
user: user,
}

values[labels] += 1
Expand All @@ -109,35 +109,44 @@ def collect_activity_metrics

def collect_session_metrics
collected = {}
users_by_id = {}

# Initialize
[:all, :audio_transcode, :video_transcode].each do |kind|
collected[kind] = Hash.new { |h, k| h[k] = 0 }
collected[kind] = Hash.new { |h, k| h[k] = Hash.new { |hh, kk| hh[kk] = 0 } }
end

send_plex_api_request(method: :get, endpoint: "/status/sessions")
.dig("MediaContainer", "Metadata")
&.each do |session_resource|
state = session_resource.dig("Player", "state")
user_id = session_resource.dig("User", "id")
users_by_id[user_id] ||= {
username: session_resource.dig("User", "title"),
}

if (transcode_session = session_resource.dig("TranscodeSession"))
if transcode_session.dig("audioDecision") == "transcode"
collected[:audio_transcode][state] += 1
collected[:audio_transcode][state][user_id] += 1
end

if transcode_session.dig("videoDecision") == "transcode"
collected[:video_transcode][state] += 1
collected[:video_transcode][state][user_id] += 1
end
end

collected[:all][state] += 1
collected[:all][state][user_id] += 1
end

collected.each do |metric_kind, counts_by_state|
collected.each do |metric_kind, counts_by_state_by_user_id|
values = {}

counts_by_state.each do |state, count|
values[{ state: state }] = count
counts_by_state_by_user_id.each do |state, counts_by_user_id|
counts_by_user_id.each do |user_id, count|
username = users_by_id.dig(user_id, :username)

values[{ state: state, user_id: user_id, username: username }] = count
end
end

set_gauge_metric_values_or_reset_missing(metric: @metrics[:"#{metric_kind}_sessions_count"], values: values)
Expand Down

0 comments on commit fafd9df

Please sign in to comment.