diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index bd75db9..356e630 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -5,7 +5,8 @@ on: branches: - '**' tags: - - 'v*.*.*' + # Must match pattern (e.g. 0.0.1) + - '*.*.*' jobs: docker: @@ -40,6 +41,11 @@ jobs: echo 'DOCKER_IMAGE_TAGS<> $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 diff --git a/README.md b/README.md index 256077e..9421738 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/lib/middleware/collector.rb b/lib/middleware/collector.rb index 59fd3cc..3dd88aa 100644 --- a/lib/middleware/collector.rb +++ b/lib/middleware/collector.rb @@ -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", @@ -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 @@ -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)