Packages
step_flow
1.7.0-rc0
1.9.0-rc2
1.9.0-rc1
1.9.0-rc0
1.8.2
1.8.1
1.8.1-rc8
1.8.1-rc7
1.8.1-rc6
1.8.1-rc5
1.8.1-rc4
1.8.1-rc3
1.8.1-rc2
1.8.1-rc1
1.8.1-rc0
1.8.0
1.8.0-rc3
1.8.0-rc2
1.8.0-rc1
1.8.0-rc0
1.7.3
1.7.3-rc4
1.7.3-rc3
1.7.3-rc2
1.7.3-rc1
1.7.3-rc0
1.7.2
1.7.2-rc4
1.7.2-rc3
1.7.2-rc2
1.7.2-rc1
1.7.2-rc0
1.7.1
1.7.0
1.7.0-rc1
1.7.0-rc0
1.6.1
1.6.1-rc1
1.6.1-rc0
1.6.0
1.6.0-rc9
1.6.0-rc8
1.6.0-rc7
1.6.0-rc6
1.6.0-rc5
1.6.0-rc4
1.6.0-rc3
1.6.0-rc20
1.6.0-rc2
1.6.0-rc19
1.6.0-rc18
1.6.0-rc17
1.6.0-rc16
1.6.0-rc15
1.6.0-rc14
1.6.0-rc13
1.6.0-rc12
1.6.0-rc11
1.6.0-rc10
1.6.0-rc1
1.5.0
1.5.0-rc1
1.4.2-rc2
1.4.2-rc1
1.4.1
1.4.1-rc1
1.4.0
1.4.0-rc4
1.4.0-rc3
1.4.0-rc2
1.4.0-rc1
1.3.1
1.3.0
1.3.0-rc
1.2.0
1.1.0
1.0.0
1.0.0-rc9
1.0.0-rc8
1.0.0-rc7
1.0.0-rc6
1.0.0-rc5
1.0.0-rc1
0.2.13
0.2.12
0.2.11
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
0.0.24
0.0.23
0.0.22
0.0.21
0.0.20
0.0.19
0.0.18
0.0.17
0.0.16
0.0.15
0.0.14
0.0.13
0.0.12
0.0.11
0.0.10
0.0.9
0.0.8
0.0.7
0.0.6
0.0.4
0.0.3
0.0.2
0.0.1
Step flow manager for Elixir applications
Current section
Files
Jump to
Current section
Files
lib/step_flow/models/statistics/jobs_durations.ex
defmodule StepFlow.Statistics.JobsDurations do
@moduledoc """
The JobsStatistics context.
"""
import Ecto.Query, warn: false
alias StepFlow.Controllers.Jobs, as: ControllersJobs
alias StepFlow.Controllers.Progressions
alias StepFlow.Jobs
alias StepFlow.Repo
alias StepFlow.Statistics.Helpers
alias StepFlow.Statistics.JobDurations
def set_job_durations(job_id) do
job = Jobs.get_job_with_status!(job_id)
durations = compute_job_duration!(job)
case get_by(%{"job_id" => job.id}) do
nil -> create_job_durations(durations)
job_durations -> update_job_durations(job_durations, durations)
end
end
defp compute_job_duration!(job) do
job_creation = get_job_creation(job)
job_start = get_job_process_start(job, job_creation)
order_pending_duration =
max(0.0, NaiveDateTime.diff(job_start, job_creation))
|> Helpers.limit_duration_to_milliseconds()
process_duration =
max(0.0, get_job_process_duration(job, job_start))
|> Helpers.limit_duration_to_milliseconds()
job_end = get_job_process_end(job, job_start)
response_pending_duration =
get_response_pending_duration(job, job_end)
|> Helpers.limit_duration_to_milliseconds()
total =
(order_pending_duration + process_duration + response_pending_duration)
|> Helpers.limit_duration_to_milliseconds()
%{
job_id: job.id,
job_start: job_start,
job_end: job_end,
order_pending_duration: order_pending_duration,
processing_duration: process_duration,
response_pending_duration: response_pending_duration,
total_duration: total,
inserted_at: job.inserted_at,
updated_at: job.updated_at
}
end
defp get_job_creation(job) do
job.inserted_at
end
defp get_job_process_start(job, job_creation) do
case job.progressions
|> Enum.filter(fn job_progression -> job_progression.progression == 0 end)
|> Enum.sort_by(fn s -> {s.inserted_at, s.id} end)
|> List.last() do
nil ->
case ControllersJobs.get_last_status(job.status) do
nil -> job_creation
last_status -> get_last_progression_time(job) || last_status.inserted_at
end
first_progression ->
first_progression.datetime
end
end
defp get_job_process_duration(job, job_start) do
case ControllersJobs.get_last_status(job.status) do
nil ->
0
last_status ->
case Map.get(last_status.description, "execution_duration") do
nil ->
job_end = get_last_progression_time(job) || last_status.inserted_at
NaiveDateTime.diff(job_end, job_start)
execution_duration ->
execution_duration
end
end
end
defp get_job_process_end(job, job_start) do
case ControllersJobs.get_last_status(job.status) do
nil ->
job_start
last_status ->
case Map.get(last_status.description, "execution_duration") do
nil ->
get_last_progression_time(job) || last_status.inserted_at
execution_duration ->
NaiveDateTime.add(job_start, round(execution_duration))
end
end
end
defp get_last_progression_time(job) do
case Progressions.get_last_progression(job.progressions) do
nil ->
nil
last_progression ->
last_progression.datetime
end
end
defp get_response_pending_duration(job, job_end) do
case {ControllersJobs.get_last_status(job.status),
Progressions.get_last_progression(job.progressions)} do
{nil, nil} ->
0
{nil, last_progression} ->
NaiveDateTime.diff(last_progression.datetime, job_end)
{last_status, nil} ->
NaiveDateTime.diff(last_status.inserted_at, job_end)
{last_status, last_progression} ->
case NaiveDateTime.compare(last_status.inserted_at, last_progression.datetime) do
:lt -> NaiveDateTime.diff(last_progression.datetime, job_end)
:eq -> NaiveDateTime.diff(last_status.inserted_at, job_end)
:gt -> NaiveDateTime.diff(last_status.inserted_at, job_end)
end
end
end
def get_by(%{"job_id" => job_id}) do
Repo.get_by(JobDurations, job_id: job_id)
end
@doc """
Creates a job durations.
## Examples
iex> create_job_durations(%{field: value})
{:ok, %JobDurations{}}
iex> create_job_durations(%{field: bad_value})
{:error, %Ecto.Changeset{}}
"""
def create_job_durations(attrs \\ %{}) do
%JobDurations{}
|> JobDurations.changeset(attrs)
|> Repo.insert()
end
@doc """
Updates a job durations.
## Examples
iex> update_job_durations(job_durations, %{field: new_value})
{:ok, %JobDurations{}}
iex> update_job_durations(job_durations, %{field: bad_value})
{:error, %Ecto.Changeset{}}
"""
def update_job_durations(%JobDurations{} = job_durations, attrs) do
job_durations
|> JobDurations.changeset(attrs)
|> Repo.update()
end
end