Skip to content

Commit

Permalink
Merge pull request #34 from PromptPal/annatarhe/pp-19-prompt-tracking
Browse files Browse the repository at this point in the history
feat(metric): add prompt metrics in last 7 days
  • Loading branch information
AnnatarHe committed Mar 10, 2024
2 parents d7e52fe + fcfda4a commit 1e00e14
Show file tree
Hide file tree
Showing 6 changed files with 175 additions and 5 deletions.
2 changes: 1 addition & 1 deletion ent/generate.go
@@ -1,3 +1,3 @@
package ent

//go:generate go run -mod=mod entgo.io/ent/cmd/ent generate --feature sql/upsert ./schema
//go:generate go run -mod=mod entgo.io/ent/cmd/ent generate --feature sql/upsert,sql/modifier ./schema
4 changes: 4 additions & 0 deletions go.sum
Expand Up @@ -279,6 +279,10 @@ github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/speps/go-hashids/v2 v2.0.1 h1:ViWOEqWES/pdOSq+C1SLVa8/Tnsd52XC34RY7lt7m4g=
github.com/speps/go-hashids/v2 v2.0.1/go.mod h1:47LKunwvDZki/uRVD6NImtyk712yFzIs3UF3KlHohGw=
github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I=
github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
Expand Down
90 changes: 90 additions & 0 deletions schema/project.metric.go
Expand Up @@ -5,6 +5,7 @@ import (
"net/http"
"time"

"entgo.io/ent/dialect/sql"
"github.com/PromptPal/PromptPal/ent"
"github.com/PromptPal/PromptPal/ent/project"
"github.com/PromptPal/PromptPal/ent/prompt"
Expand Down Expand Up @@ -80,6 +81,95 @@ func (p projectPromptMetricsResponse) RecentCounts(ctx context.Context) (res []p
return
}

type ProjectPromptMetricsByDate struct {
date time.Time
datum []projectPromptMetricsRecentCount
}

func (p ProjectPromptMetricsByDate) Date() string {
return p.date.Format(time.RFC3339)
}

func (p ProjectPromptMetricsByDate) Prompts() []projectPromptMetricsRecentCount {
return p.datum
}

func (p projectPromptMetricsResponse) Last7Days(ctx context.Context) (res []ProjectPromptMetricsByDate, err error) {
var result []struct {
Date string `json:"d"`
Pid int `json:"prompt_calls"`
Count int `json:"count"`
}

err = service.
EntClient.
PromptCall.
Query().
Where(promptcall.HasProjectWith(project.ID(p.p.ID))).
Where(promptcall.CreateTimeGT(time.Now().AddDate(0, 0, -7))).
Select(promptcall.FieldPromptId).
Aggregate(func(s *sql.Selector) string {
return sql.As("DATE(create_time)", "d")
}, ent.Count()).
Modify(func(s *sql.Selector) {
s.GroupBy("d", promptcall.FieldPromptId)
s.OrderBy(sql.Desc("d"))
}).
Scan(ctx, &result)

if err != nil {
err = NewGraphQLHttpError(http.StatusInternalServerError, err)
return
}

if len(result) == 0 {
return
}

promptIds := make([]int, 0)

for _, r := range result {
promptIds = append(promptIds, r.Pid)
}

ps, err := service.
EntClient.
Prompt.
Query().
Where(prompt.IDIn(promptIds...)).
All(ctx)

if err != nil {
err = NewGraphQLHttpError(http.StatusInternalServerError, err)
return
}

psMap := make(map[int]*ent.Prompt)
for _, p := range ps {
psMap[p.ID] = p
}

reply := map[time.Time][]projectPromptMetricsRecentCount{}

for _, r := range result {
d := r.Date + "T00:00:00Z"
dd, _ := time.Parse(time.RFC3339, d)
reply[dd] = append(reply[dd], projectPromptMetricsRecentCount{
p: psMap[r.Pid],
count: r.Count,
})
}

for d, ps := range reply {
res = append(res, ProjectPromptMetricsByDate{
date: d,
datum: ps,
})
}

return
}

func (p projectPromptMetricsRecentCount) Prompt() promptResponse {
return promptResponse{p.p}
}
Expand Down
62 changes: 62 additions & 0 deletions schema/prompt.metrics.go
@@ -0,0 +1,62 @@
package schema

import (
"context"
"net/http"
"time"

"entgo.io/ent/dialect/sql"
"github.com/PromptPal/PromptPal/ent/prompt"
"github.com/PromptPal/PromptPal/ent/promptcall"
"github.com/PromptPal/PromptPal/service"
)

type promptCallMetricBySQL struct {
P50 float32 `json:"p50"`
P90 float32 `json:"p90"`
P99 float32 `json:"p99"`
}

type promptMetrics struct {
data *promptCallMetricBySQL
}

func (p promptResponse) Metrics(ctx context.Context) (res promptMetrics, err error) {

var temp []promptCallMetricBySQL

err = service.
EntClient.
PromptCall.
Query().
Where(promptcall.HasPromptWith(prompt.ID(int(p.prompt.ID)))).
Where(promptcall.CreateTimeGT(time.Now().AddDate(-1, 0, 0))).
Aggregate(func(s *sql.Selector) string {
return sql.As("percentile_cont(0.5) within group (order by duration asc)", "p50")
}, func(s *sql.Selector) string {
return sql.As("percentile_cont(0.9) within group (order by duration asc)", "p90")
}, func(s *sql.Selector) string {
return sql.As("percentile_cont(0.99) within group (order by duration asc)", "p99")
}).
Scan(ctx, &temp)

if err != nil {
err = NewGraphQLHttpError(http.StatusInternalServerError, err)
return
}

if len(temp) > 0 {
res.data = &temp[0]
}
return
}

func (p promptMetrics) P50() float64 {
return float64(p.data.P50)
}
func (p promptMetrics) P90() float64 {
return float64(p.data.P90)
}
func (p promptMetrics) P99() float64 {
return float64(p.data.P99)
}
7 changes: 7 additions & 0 deletions schema/types/project.gql
Expand Up @@ -23,8 +23,15 @@ type ProjectPromptMetricsRecentCount {
prompt: Prompt!
count: Int!
}

type ProjectPromptMetricsByDate {
date: String!
prompts: [ProjectPromptMetricsRecentCount!]!
}

type ProjectPromptMetrics {
recentCounts: [ProjectPromptMetricsRecentCount!]!
last7Days: [ProjectPromptMetricsByDate!]!
}

type Project {
Expand Down
15 changes: 11 additions & 4 deletions schema/types/prompt.gql
Expand Up @@ -14,8 +14,8 @@ enum PublicLevel {
}

input PromptRowInput {
prompt: String!
role: PromptRole!
prompt: String!
role: PromptRole!
}

input PromptVariableInput {
Expand All @@ -24,8 +24,8 @@ input PromptVariableInput {
}

type PromptRow {
prompt: String!
role: PromptRole!
prompt: String!
role: PromptRole!
}

type PromptVariable {
Expand Down Expand Up @@ -61,9 +61,16 @@ type Prompt {
createdAt: String!
updatedAt: String!
latestCalls: PromptCallList!
metrics: PromptMetrics!
}

type PromptList {
count: Int!
edges: [Prompt!]!
}

type PromptMetrics {
p50: Float!
p90: Float!
p99: Float!
}

0 comments on commit 1e00e14

Please sign in to comment.