arize-phoenix 11.24.1__py3-none-any.whl → 11.25.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of arize-phoenix might be problematic. Click here for more details.
- {arize_phoenix-11.24.1.dist-info → arize_phoenix-11.25.0.dist-info}/METADATA +1 -1
- {arize_phoenix-11.24.1.dist-info → arize_phoenix-11.25.0.dist-info}/RECORD +33 -32
- phoenix/__init__.py +2 -1
- phoenix/db/engines.py +12 -18
- phoenix/db/insertion/document_annotation.py +0 -1
- phoenix/db/insertion/span_annotation.py +0 -1
- phoenix/db/insertion/trace_annotation.py +0 -1
- phoenix/db/insertion/types.py +0 -15
- phoenix/db/models.py +2 -2
- phoenix/server/api/dataloaders/annotation_summaries.py +60 -8
- phoenix/server/api/dataloaders/latency_ms_quantile.py +40 -8
- phoenix/server/api/dataloaders/record_counts.py +37 -10
- phoenix/server/api/dataloaders/span_cost_summary_by_project.py +28 -14
- phoenix/server/api/helpers/playground_clients.py +10 -4
- phoenix/server/api/routers/v1/spans.py +17 -17
- phoenix/server/api/types/Project.py +106 -44
- phoenix/server/email/sender.py +5 -2
- phoenix/server/session_filters.py +49 -0
- phoenix/server/static/.vite/manifest.json +43 -43
- phoenix/server/static/assets/{components-CBjkyAZ_.js → components-Dpf_EwE7.js} +334 -332
- phoenix/server/static/assets/{index-kl9TdGAc.js → index-gkM1FDH4.js} +5 -2
- phoenix/server/static/assets/{pages-B8T9ap-6.js → pages-Dz3WExiG.js} +703 -462
- phoenix/server/static/assets/{vendor-CU36oj8y.js → vendor-RdRDaQiR.js} +1 -1
- phoenix/server/static/assets/{vendor-arizeai-Ctgw0e1G.js → vendor-arizeai-DsYDNOqt.js} +2 -2
- phoenix/server/static/assets/{vendor-codemirror-Cojjzqb9.js → vendor-codemirror-BzJDUbEx.js} +3 -3
- phoenix/server/static/assets/{vendor-recharts-Bw30oz1A.js → vendor-recharts-BTHn5Y2R.js} +1 -1
- phoenix/server/static/assets/{vendor-shiki-DZajAPeq.js → vendor-shiki-BAcocHFl.js} +1 -1
- phoenix/trace/dsl/query.py +2 -0
- phoenix/version.py +1 -1
- {arize_phoenix-11.24.1.dist-info → arize_phoenix-11.25.0.dist-info}/WHEEL +0 -0
- {arize_phoenix-11.24.1.dist-info → arize_phoenix-11.25.0.dist-info}/entry_points.txt +0 -0
- {arize_phoenix-11.24.1.dist-info → arize_phoenix-11.25.0.dist-info}/licenses/IP_NOTICE +0 -0
- {arize_phoenix-11.24.1.dist-info → arize_phoenix-11.25.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
phoenix/__init__.py,sha256=
|
|
1
|
+
phoenix/__init__.py,sha256=Sgb4r2MLoY2BbC9Caky5C0bwnOyiVOMHly2sRItmg3Q,5555
|
|
2
2
|
phoenix/auth.py,sha256=9rscOefuxy5VPcb6MlOYenuy3gDd5l7RxknONovGslE,11342
|
|
3
3
|
phoenix/config.py,sha256=oz-7FW2Pixzgp3Xvs5RM-M7J7mES8_yWdVGo_Tzde9s,63133
|
|
4
4
|
phoenix/datetime_utils.py,sha256=pRD-nzxXYKlMWNtd3r2tKGKfPFhwuJhfOAtlGLVAO60,8784
|
|
@@ -6,7 +6,7 @@ phoenix/exceptions.py,sha256=n2L2KKuecrdflB9MsCdAYCiSEvGJptIsfRkXMoJle7A,169
|
|
|
6
6
|
phoenix/py.typed,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
|
7
7
|
phoenix/services.py,sha256=ngkyKGVatX3cO2WJdo2hKdaVKP-xJCMvqthvga6kJss,5196
|
|
8
8
|
phoenix/settings.py,sha256=2kHfT3BNOVd4dAO1bq-syEQbHSG8oX2-7NhOwK2QREk,896
|
|
9
|
-
phoenix/version.py,sha256=
|
|
9
|
+
phoenix/version.py,sha256=nausyt9ru1_40PInSw-LEDDfhSxB-gXbap31hGbEtag,24
|
|
10
10
|
phoenix/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
11
11
|
phoenix/core/embedding_dimension.py,sha256=zKGbcvwOXgLf-yrJBpQyKtd-LEOPRKHnUToyAU8Owis,87
|
|
12
12
|
phoenix/core/model.py,sha256=qBFraOtmwCCnWJltKNP18DDG0mULXigytlFsa6YOz6k,4837
|
|
@@ -17,23 +17,23 @@ phoenix/db/__init__.py,sha256=pDjEFXukHmJBM-1D8RjmXkvLsz85YWNxMQczt81ec3A,118
|
|
|
17
17
|
phoenix/db/alembic.ini,sha256=GIS6HpHaKaJbbuahZg1Rc1D2_QqyCkV9r58wdARGf6w,3262
|
|
18
18
|
phoenix/db/bulk_inserter.py,sha256=MbbmKip6gFtnLP1ZA3Z-mP-zy-Qnb9bPD8mRXJQOW2c,14536
|
|
19
19
|
phoenix/db/constants.py,sha256=-YE2rkzcROG06_rerfnX5hC7fLzOHx1Gjw4nXhX_um4,46
|
|
20
|
-
phoenix/db/engines.py,sha256=
|
|
20
|
+
phoenix/db/engines.py,sha256=e-VdW9FZVrs-F8P8FeQP2NzOTOXuq9LeUq1ebv99ZdM,6731
|
|
21
21
|
phoenix/db/enums.py,sha256=w3O5YuJEEzVTwVDZb8b2UUFhU8yK_GosF081VVrrno0,188
|
|
22
22
|
phoenix/db/facilitator.py,sha256=UIC-l14p3R8GFVWPmz04NY-CDm_zAynXCAuIYpj_W_g,20254
|
|
23
23
|
phoenix/db/helpers.py,sha256=jqX13kO4qdGozDRdw6nME4BloPtzEQd0fweQpGHbj3I,15078
|
|
24
24
|
phoenix/db/migrate.py,sha256=oUrXH8yEbcpL4eh09aSCuUiSrhFli0eT5D_j4ZmYChY,2797
|
|
25
|
-
phoenix/db/models.py,sha256=
|
|
25
|
+
phoenix/db/models.py,sha256=VV8oPYwfkeg0KbeuUCtgr3dwLXveQ3bs8J6tPboTH84,61989
|
|
26
26
|
phoenix/db/pg_config.py,sha256=h6mB7qF7t4Zk6VGvAiyefHGVu74o-yJynaWzeE39k9Y,6001
|
|
27
27
|
phoenix/db/insertion/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
28
28
|
phoenix/db/insertion/constants.py,sha256=8wifm7X-1XvroZ__R2Gc96NsgLhTDn0zXl4lehlXtcA,70
|
|
29
29
|
phoenix/db/insertion/dataset.py,sha256=KeUtfSnznmkDDlGs6KM5URduZtIo8I951tybamwoLsc,7216
|
|
30
|
-
phoenix/db/insertion/document_annotation.py,sha256=
|
|
30
|
+
phoenix/db/insertion/document_annotation.py,sha256=rLL35nxcBXh2O1RaY-R_nucER6wVPZBVJ3XkQQnmiQE,6498
|
|
31
31
|
phoenix/db/insertion/evaluation.py,sha256=XIlDQMx9FFu_hO1TEao8_ScgKETw61AoeGezsmngXrY,6876
|
|
32
32
|
phoenix/db/insertion/helpers.py,sha256=wA4f_B8DI1pfNvX7R5luG1MklwX6rtCrvv_SOcjtJGo,4106
|
|
33
33
|
phoenix/db/insertion/span.py,sha256=UB4UR8QlkJdVzbJ7_-S6FXIHYjyKZSOEVzCOvwGw7cY,8414
|
|
34
|
-
phoenix/db/insertion/span_annotation.py,sha256=
|
|
35
|
-
phoenix/db/insertion/trace_annotation.py,sha256=
|
|
36
|
-
phoenix/db/insertion/types.py,sha256=
|
|
34
|
+
phoenix/db/insertion/span_annotation.py,sha256=EqjT7OcCUO69PAw3shkOSQunxWtLNpToO7gtqlK8dbY,5682
|
|
35
|
+
phoenix/db/insertion/trace_annotation.py,sha256=0wIrAEDMYDvwRbd7zYAGIcnZtdjoPEINP51m28Wk1VI,5722
|
|
36
|
+
phoenix/db/insertion/types.py,sha256=hOwtuYeKA7rjRXT2bfsD_SwYnkrIpxdVirQ50jq1fws,8253
|
|
37
37
|
phoenix/db/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
38
38
|
phoenix/db/migrations/env.py,sha256=tFO3ceuCx9Es5_2w_BXclaQMmNQKNX21b1UEV5mYdeo,3387
|
|
39
39
|
phoenix/db/migrations/script.py.mako,sha256=MEqL-2qATlST9TAOeYgscMn1uy6HUS9NFvDgl93dMj8,635
|
|
@@ -103,6 +103,7 @@ phoenix/server/oauth2.py,sha256=GvUqZBoZ5dG-l2G1RMl1SUcN10jNAjaMXFznMSWz2Zs,3336
|
|
|
103
103
|
phoenix/server/prometheus.py,sha256=PV3XNUvtBQqpIjFS5ulyhGK_WF-2v-Wf3rsXjfDxeUs,8694
|
|
104
104
|
phoenix/server/rate_limiters.py,sha256=cFc73D2NaxqNZZDbwfIDw4So-fRVOJPBtqxOZ8Qky_s,7155
|
|
105
105
|
phoenix/server/retention.py,sha256=MQe1FWuc_NxhqgIq5q2hfFhWT8ddAmpppgI74xYEQ6c,3064
|
|
106
|
+
phoenix/server/session_filters.py,sha256=zEJHnF2sDCxjWti2eOz1Yx4r4-zS1rAzq0oUxzl0gEY,1697
|
|
106
107
|
phoenix/server/telemetry.py,sha256=4EluDDrhdDPxAjaW6lVSbi73xkB5XeUCZWOmZGdk0hg,2755
|
|
107
108
|
phoenix/server/thread_server.py,sha256=Ea2AWreN1lwJsT2wYvGaRaiXrzBqH4kgkZpx0FO5Ocw,2144
|
|
108
109
|
phoenix/server/types.py,sha256=j8erl9iRNaR8t0DCQG84-uDVbHy9Qnm7T2EuTtDNNsU,8013
|
|
@@ -118,7 +119,7 @@ phoenix/server/api/subscriptions.py,sha256=U7JZl-FGfsaIhRkIFdeSQLqR7xCS7CY1h-21B
|
|
|
118
119
|
phoenix/server/api/utils.py,sha256=quCBRcusc6PUq9tJq7M8PgwFZp7nXgVAxtbw8feribY,833
|
|
119
120
|
phoenix/server/api/dataloaders/__init__.py,sha256=ddiX1BdbyGkPTzMZNo-hkF_2kqIquelBUFvQejnAJYk,6834
|
|
120
121
|
phoenix/server/api/dataloaders/annotation_configs_by_project.py,sha256=_Nfiug9o01JimU3Z0LpZJ0uaMCjchXomyt_dYAxPFRY,1178
|
|
121
|
-
phoenix/server/api/dataloaders/annotation_summaries.py,sha256=
|
|
122
|
+
phoenix/server/api/dataloaders/annotation_summaries.py,sha256=0b23-bucBKyL25RWb2QzCNJjQzrq403qMmHKUVD5W4M,14377
|
|
122
123
|
phoenix/server/api/dataloaders/average_experiment_run_latency.py,sha256=GLFoFAbztOH-0FVzzZ77mATIO63UcjB50j3qXiNi-tE,1811
|
|
123
124
|
phoenix/server/api/dataloaders/dataset_example_revisions.py,sha256=xF7M2dg3UmjhdCrscnztCIBBI0cg3RF48IIqvilpc18,4623
|
|
124
125
|
phoenix/server/api/dataloaders/dataset_example_spans.py,sha256=z_MFquqAcJ9wat7BBp7MVeJ9BYuu2EZEdaog52iWDno,1390
|
|
@@ -131,14 +132,14 @@ phoenix/server/api/dataloaders/experiment_run_annotations.py,sha256=uJ--9Ue4tnmZ
|
|
|
131
132
|
phoenix/server/api/dataloaders/experiment_run_counts.py,sha256=j_7229IL705p_TycxIMYylhSgLHsAn91TiGPYXtOuQ8,1617
|
|
132
133
|
phoenix/server/api/dataloaders/experiment_sequence_number.py,sha256=zM_f78fnqhppLtevrx9iISQSN7w_BNeXT9CoX8jYgAI,1534
|
|
133
134
|
phoenix/server/api/dataloaders/last_used_times_by_generative_model_id.py,sha256=4i3HqwP71bZ8vwyyj7v63IuKEJnUZI1GWpP1FW_xMZA,1330
|
|
134
|
-
phoenix/server/api/dataloaders/latency_ms_quantile.py,sha256=
|
|
135
|
+
phoenix/server/api/dataloaders/latency_ms_quantile.py,sha256=LjxXK8pM-_yPmT5k23uLD17bbgt_UOMSAVvNPwqtWME,8542
|
|
135
136
|
phoenix/server/api/dataloaders/min_start_or_max_end_times.py,sha256=1jYglTXv4S8k7OWSGdgeJ2OxVCmZtX8a6sjJp9GPZ04,2783
|
|
136
137
|
phoenix/server/api/dataloaders/num_child_spans.py,sha256=655g9SP_3gfT4qqukfgKzLy5uBLQmnVQBP-mZL3in0s,1200
|
|
137
138
|
phoenix/server/api/dataloaders/num_spans_per_trace.py,sha256=nNAxj6QYcTc8oykfJZxH0vtS9tE83oXoArVwQTJHzTw,922
|
|
138
139
|
phoenix/server/api/dataloaders/project_by_name.py,sha256=O24Rjs0ZQaYtSnPfA6YBQfbHfUgNsHKUcc_gIKyK9vo,1086
|
|
139
140
|
phoenix/server/api/dataloaders/project_ids_by_trace_retention_policy_id.py,sha256=KWaFZGI4wJaUftLoUJ4ufJYNx1UAWrFfVfloVGOX1XE,1606
|
|
140
141
|
phoenix/server/api/dataloaders/prompt_version_sequence_number.py,sha256=tBaCbpI9KgjCACvpd-5hZy5TDSHH7PJPn4bd1xJuN-g,1314
|
|
141
|
-
phoenix/server/api/dataloaders/record_counts.py,sha256=
|
|
142
|
+
phoenix/server/api/dataloaders/record_counts.py,sha256=xUEb-eufdfShkEpdzWxzWJ81A3s0vmbYE5mmhN-DFWM,5310
|
|
142
143
|
phoenix/server/api/dataloaders/session_io.py,sha256=1c2b-87KGHuF2sgeQvXmIv1-kFHEt6CfAvuH11jKfh4,3168
|
|
143
144
|
phoenix/server/api/dataloaders/session_num_traces.py,sha256=lu5EMdQWQzEr_4wCiu7FycnIShjGf0yQXpwBG_DDzGs,1050
|
|
144
145
|
phoenix/server/api/dataloaders/session_num_traces_with_error.py,sha256=Y5xmr4Nme2ZMfvJljW9yhBfuCNdGlxTRka0h9VdXdqA,1149
|
|
@@ -155,7 +156,7 @@ phoenix/server/api/dataloaders/span_cost_details_by_span_cost.py,sha256=f8ztQACG
|
|
|
155
156
|
phoenix/server/api/dataloaders/span_cost_summary_by_experiment.py,sha256=EvivIoLsg1KxlRm4MM-LiInxFsRzqZpLarsvjyQk8e8,2453
|
|
156
157
|
phoenix/server/api/dataloaders/span_cost_summary_by_experiment_run.py,sha256=IJFirEPeR1UGKTg6Gz3MJQGDigoPy6SaFnUdBibyVac,2539
|
|
157
158
|
phoenix/server/api/dataloaders/span_cost_summary_by_generative_model.py,sha256=Fhp0NPsoSbTBgnE38hregVVeVHEhPw_QANiOfNyaTf8,2295
|
|
158
|
-
phoenix/server/api/dataloaders/span_cost_summary_by_project.py,sha256=
|
|
159
|
+
phoenix/server/api/dataloaders/span_cost_summary_by_project.py,sha256=N3cds3ooMU25Xbp9Z5Zlp-3a4AcNwRu0XpqaTgsKOoE,6002
|
|
159
160
|
phoenix/server/api/dataloaders/span_cost_summary_by_project_session.py,sha256=kvsMK8GkFBubMiKZ0KwDk5O2D3LvXIg_zKT66MoKazE,2362
|
|
160
161
|
phoenix/server/api/dataloaders/span_cost_summary_by_trace.py,sha256=XCq1mRGwNN5xucf4ea-V1cHus_VQQJyjR40UKCOmWHg,2274
|
|
161
162
|
phoenix/server/api/dataloaders/span_costs.py,sha256=hlNrofQNNuGi4XFxOt7OV_ceBJ6mu_aKsDMz7SSoM3A,1161
|
|
@@ -176,7 +177,7 @@ phoenix/server/api/helpers/__init__.py,sha256=m2-xaSPqUiSs91k62JaRDjFNfl-1byxBfY
|
|
|
176
177
|
phoenix/server/api/helpers/annotations.py,sha256=9gMXKpMTfWEChoSCnvdWYuyB0hlSnNOp-qUdar9Vono,262
|
|
177
178
|
phoenix/server/api/helpers/dataset_helpers.py,sha256=3bdGBoUzqrtg-sr5p2wpQLOU6dhg_3TKFHNeJj8p0TU,9155
|
|
178
179
|
phoenix/server/api/helpers/experiment_run_filters.py,sha256=DOnVwrmn39eAkk2mwuZP8kIcAnR5jrOgllEwWSjsw94,29893
|
|
179
|
-
phoenix/server/api/helpers/playground_clients.py,sha256=
|
|
180
|
+
phoenix/server/api/helpers/playground_clients.py,sha256=DgmDM6ismCwm1GLB4_9DnWsPCZsd2L-vpc0m8-5mjN0,72212
|
|
180
181
|
phoenix/server/api/helpers/playground_registry.py,sha256=n0v4-KnvZJxeaEwOla5qBbnOQjSWznKmMhZnh9ziJt0,2584
|
|
181
182
|
phoenix/server/api/helpers/playground_spans.py,sha256=QpXwPl_fFNwm_iA1A77XApUyXMl1aDmonw8aXuNZ_4k,17132
|
|
182
183
|
phoenix/server/api/helpers/prompts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -265,7 +266,7 @@ phoenix/server/api/routers/v1/experiments.py,sha256=hIBecGACzGZEgl93ap_JV52pUv-I
|
|
|
265
266
|
phoenix/server/api/routers/v1/models.py,sha256=p3gJN-9SWiUYTUTft4bZMsZVCBNTb4nN1Foy68eRZzQ,1997
|
|
266
267
|
phoenix/server/api/routers/v1/projects.py,sha256=XR6uJxHXXtC1q8LNyS9W6iaj440sv1OKCu-OSBfxEys,12824
|
|
267
268
|
phoenix/server/api/routers/v1/prompts.py,sha256=chRYcLkOYDJdJfVZVukVTUyIRnLPvsJCg41CuPxOIU8,26695
|
|
268
|
-
phoenix/server/api/routers/v1/spans.py,sha256=
|
|
269
|
+
phoenix/server/api/routers/v1/spans.py,sha256=la_bfxrVPGY-N8qvk9o9ICrGiwl1B6-jbZ0uDjR5QXc,49345
|
|
269
270
|
phoenix/server/api/routers/v1/traces.py,sha256=Skn0N_L4ZjoJ7x76PBrqvbKPFiAk8xSe1yxfiOaQ0Gc,11285
|
|
270
271
|
phoenix/server/api/routers/v1/users.py,sha256=eO8zMtGU33Td2_G1l9D7Z0a4CG1CwBUCj_Z9z2uk7wg,12089
|
|
271
272
|
phoenix/server/api/routers/v1/utils.py,sha256=oXIOGPzPTkE0ZWUTRCoRIQQ7wTzoSwtWFaUSjlGBqts,4960
|
|
@@ -321,7 +322,7 @@ phoenix/server/api/types/ModelInterface.py,sha256=Qe7H23wDb_Q2-HmeY2t0R5Jsn4aAfY
|
|
|
321
322
|
phoenix/server/api/types/NumericRange.py,sha256=afEjgF97Go_OvmjMggbPBt-zGM8IONewAyEiKEHRds0,192
|
|
322
323
|
phoenix/server/api/types/PerformanceMetric.py,sha256=KFkmJDqP43eDUtARQOUqR7NYcxvL6Vh2uisHWU6H3ko,387
|
|
323
324
|
phoenix/server/api/types/PlaygroundModel.py,sha256=IqJFxsAAJMRyaFI9ryI3GQrpFOJ5Llf6kIutEO-tFvM,321
|
|
324
|
-
phoenix/server/api/types/Project.py,sha256=
|
|
325
|
+
phoenix/server/api/types/Project.py,sha256=XJUVEGCmEgToIyoVNWpNgcgtV1g24DvAKzFHpDNpCJY,72020
|
|
325
326
|
phoenix/server/api/types/ProjectSession.py,sha256=uwqTsDTfSGz13AvP-cwS_mJR5JZ1lHqu10ungbl7g5s,6245
|
|
326
327
|
phoenix/server/api/types/ProjectTraceRetentionPolicy.py,sha256=tYy2kgalPDyuaYZr0VUHjH0YpXaiF_QOzg5yfaV_c7c,3782
|
|
327
328
|
phoenix/server/api/types/Prompt.py,sha256=ccP4eq1e38xbF0afclGWLOuDpBVpNbJ3AOSRClF8yFQ,4955
|
|
@@ -370,7 +371,7 @@ phoenix/server/daemons/db_disk_usage_monitor.py,sha256=2WBkrL1QyRGbLtskXEdxwAdnW
|
|
|
370
371
|
phoenix/server/daemons/generative_model_store.py,sha256=CkMG0jFWtxcUNP_7iFTgzHPyl5IgnXUwwJb7584pmkI,1566
|
|
371
372
|
phoenix/server/daemons/span_cost_calculator.py,sha256=M7bG8fas99xz37bZUkBXnG37U2otUcu1-FI5RmrtPgU,3052
|
|
372
373
|
phoenix/server/email/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
373
|
-
phoenix/server/email/sender.py,sha256=
|
|
374
|
+
phoenix/server/email/sender.py,sha256=tmigvAyLV6cyGLfH6Ks_q0L5wlTpo6mBB951QCmhadw,5161
|
|
374
375
|
phoenix/server/email/types.py,sha256=f1XXk4OQJlLSCHweujrGlkZic7CtbUSnfdPXzqP9WRI,772
|
|
375
376
|
phoenix/server/email/templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
376
377
|
phoenix/server/email/templates/db_disk_usage_notification.html,sha256=Atv2XnKkC7HasTTCZYAWySr7VbupAGwbIiJ9eQ4r2l0,906
|
|
@@ -391,16 +392,16 @@ phoenix/server/static/apple-touch-icon-76x76.png,sha256=CT_xT12I0u2i0WU8JzBZBuOQ
|
|
|
391
392
|
phoenix/server/static/apple-touch-icon.png,sha256=fOfpjqGpWYbJ0eAurKsyoZP1EAs6ZVooBJ_SGk2ZkDs,3801
|
|
392
393
|
phoenix/server/static/favicon.ico,sha256=bY0vvCKRftemZfPShwZtE93DiiQdaYaozkPGwNFr6H8,34494
|
|
393
394
|
phoenix/server/static/modernizr.js,sha256=mvK-XtkNqjOral-QvzoqsyOMECXIMu5BQwSVN_wcU9c,2564
|
|
394
|
-
phoenix/server/static/.vite/manifest.json,sha256=
|
|
395
|
-
phoenix/server/static/assets/components-
|
|
396
|
-
phoenix/server/static/assets/index-
|
|
397
|
-
phoenix/server/static/assets/pages-
|
|
398
|
-
phoenix/server/static/assets/vendor-CU36oj8y.js,sha256=rZlYxvj7jMRVoS5R8tE1MPDinsDMw1uPJK1wfhYhB9A,2595492
|
|
395
|
+
phoenix/server/static/.vite/manifest.json,sha256=1p6CFldL1B2ozidI2mlXUZK6OGNKgZriJuJm5Js2GcE,2328
|
|
396
|
+
phoenix/server/static/assets/components-Dpf_EwE7.js,sha256=ThUtEg3emYU04geudL-beTYLWLps3-fbM7LR0fpeQgE,662204
|
|
397
|
+
phoenix/server/static/assets/index-gkM1FDH4.js,sha256=STwgF05WHMxpiZ8CVVwd8F_fgEgTWg_4yi7YfqFTGUE,63396
|
|
398
|
+
phoenix/server/static/assets/pages-Dz3WExiG.js,sha256=kwVTyXKXRaU6svXYq4FkeQ5Szug7s7MJCPVCE0KRdOw,1264641
|
|
399
399
|
phoenix/server/static/assets/vendor-CqDb5u4o.css,sha256=zIyFiNJKxMaQk8AvtLgt1rR01oO10d1MFndSDKH9Clw,5517
|
|
400
|
-
phoenix/server/static/assets/vendor-
|
|
401
|
-
phoenix/server/static/assets/vendor-
|
|
402
|
-
phoenix/server/static/assets/vendor-
|
|
403
|
-
phoenix/server/static/assets/vendor-
|
|
400
|
+
phoenix/server/static/assets/vendor-RdRDaQiR.js,sha256=oTxLetZZXJ20yoKNAYExto9V73y8X5zjddWV46K9CWM,2595492
|
|
401
|
+
phoenix/server/static/assets/vendor-arizeai-DsYDNOqt.js,sha256=0HIkPJXbKTh85nqphdAXYeStRzdaim0IQxRXiXxa21U,121514
|
|
402
|
+
phoenix/server/static/assets/vendor-codemirror-BzJDUbEx.js,sha256=bhTldvpKQzXpFgxi3cdGSFjNupkDYuEKcJzQLCN5WwY,402623
|
|
403
|
+
phoenix/server/static/assets/vendor-recharts-BTHn5Y2R.js,sha256=yzTedksGlH1StFC39Tr3K0i86SQHtT2VZls7-2uQWys,231651
|
|
404
|
+
phoenix/server/static/assets/vendor-shiki-BAcocHFl.js,sha256=70yCHhKjrYFycTHifz6VT7KsAekW1wA4OX0Op8YhlIY,305160
|
|
404
405
|
phoenix/server/static/assets/vendor-three-BLWp5bic.js,sha256=vfSCVXS20jA0Ceo_O0mDxYBcROinWMdPE6RR4JXmtec,620972
|
|
405
406
|
phoenix/server/templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
406
407
|
phoenix/server/templates/index.html,sha256=QAYh0TG5mg-GvDQUR09aD9ebl9Sfq0fYAcfIa5G7J6E,7148
|
|
@@ -427,7 +428,7 @@ phoenix/trace/dsl/README.md,sha256=ihmP9zGUC5V-TDbzKla76LuyDqPDQIBUH2BORwxNI68,2
|
|
|
427
428
|
phoenix/trace/dsl/__init__.py,sha256=WIQIjJg362XD3s50OsPJJ0xbDsGp41bSv7vDllLrPuA,144
|
|
428
429
|
phoenix/trace/dsl/filter.py,sha256=FYOzH1gkwlKBYepscZzwHeeXnJdTadC_m4v0cYRs00Y,31557
|
|
429
430
|
phoenix/trace/dsl/helpers.py,sha256=Hc0HRqvYWl71waee0vKLNwmszc2Q1ba4Q8svXxeEqJI,7708
|
|
430
|
-
phoenix/trace/dsl/query.py,sha256=
|
|
431
|
+
phoenix/trace/dsl/query.py,sha256=QzK7I3juzUwb65Dkqf-nFw9dvt6F0hBNNSCGRNuXOeY,36511
|
|
431
432
|
phoenix/trace/v1/__init__.py,sha256=-IbAD0ruESMjvQLvGAg9CTfjBUATFDx1OXseDPis6-0,88
|
|
432
433
|
phoenix/trace/v1/evaluation_pb2.py,sha256=8sXvv2BW_vqD30MOMbmkeE2zpmm7ncik21kl3e-HzeQ,2254
|
|
433
434
|
phoenix/trace/v1/evaluation_pb2.pyi,sha256=cCbbx06gwQmaH14s3J1X25TtaARh-k1abbxQdQCXGm8,4500
|
|
@@ -441,9 +442,9 @@ phoenix/utilities/project.py,sha256=auVpARXkDb-JgeX5f2aStyFIkeKvGwN9l7qrFeJMVxI,
|
|
|
441
442
|
phoenix/utilities/re.py,sha256=6YyUWIkv0zc2SigsxfOWIHzdpjKA_TZo2iqKq7zJKvw,2081
|
|
442
443
|
phoenix/utilities/span_store.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
443
444
|
phoenix/utilities/template_formatters.py,sha256=gh9PJD6WEGw7TEYXfSst1UR4pWWwmjxMLrDVQ_CkpkQ,2779
|
|
444
|
-
arize_phoenix-11.
|
|
445
|
-
arize_phoenix-11.
|
|
446
|
-
arize_phoenix-11.
|
|
447
|
-
arize_phoenix-11.
|
|
448
|
-
arize_phoenix-11.
|
|
449
|
-
arize_phoenix-11.
|
|
445
|
+
arize_phoenix-11.25.0.dist-info/METADATA,sha256=uBFF5d07OVgeH4gaZ8cPljig7T4syd6PS1Zgvg_GWI0,31634
|
|
446
|
+
arize_phoenix-11.25.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
447
|
+
arize_phoenix-11.25.0.dist-info/entry_points.txt,sha256=Pgpn8Upxx9P8z8joPXZWl2LlnAlGc3gcQoVchb06X1Q,94
|
|
448
|
+
arize_phoenix-11.25.0.dist-info/licenses/IP_NOTICE,sha256=JBqyyCYYxGDfzQ0TtsQgjts41IJoa-hiwDrBjCb9gHM,469
|
|
449
|
+
arize_phoenix-11.25.0.dist-info/licenses/LICENSE,sha256=HFkW9REuMOkvKRACuwLPT0hRydHb3zNg-fdFt94td18,3794
|
|
450
|
+
arize_phoenix-11.25.0.dist-info/RECORD,,
|
phoenix/__init__.py
CHANGED
|
@@ -87,8 +87,9 @@ class PhoenixTraceOpenAILoader(Loader):
|
|
|
87
87
|
"https://arize.com/docs/phoenix/tracing/integrations-tracing/openai"
|
|
88
88
|
"\n\n"
|
|
89
89
|
"Example usage:\n\n"
|
|
90
|
+
"pip install openinference-instrumentation-openai\n\n"
|
|
90
91
|
"```python\n"
|
|
91
|
-
"from phoenix.otel register\n"
|
|
92
|
+
"from phoenix.otel import register\n"
|
|
92
93
|
"from openinference.instrumentation.openai import OpenAIInstrumentor\n\n"
|
|
93
94
|
"tracer_provider = register()\n"
|
|
94
95
|
"OpenAIInstrumentor().instrument(tracer_provider=tracer_provider)\n"
|
phoenix/db/engines.py
CHANGED
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import asyncio
|
|
4
|
-
import json
|
|
5
4
|
import logging
|
|
6
5
|
from collections.abc import Callable
|
|
7
|
-
from datetime import datetime
|
|
8
6
|
from enum import Enum
|
|
9
7
|
from sqlite3 import Connection
|
|
10
8
|
from typing import Any
|
|
11
9
|
|
|
12
10
|
import aiosqlite
|
|
13
11
|
import numpy as np
|
|
12
|
+
import orjson
|
|
14
13
|
import sqlalchemy
|
|
15
14
|
import sqlean
|
|
16
15
|
from sqlalchemy import URL, StaticPool, event, make_url
|
|
@@ -193,19 +192,14 @@ def aio_postgresql_engine(
|
|
|
193
192
|
|
|
194
193
|
|
|
195
194
|
def _dumps(obj: Any) -> str:
|
|
196
|
-
return
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
elif isinstance(obj, np.integer):
|
|
208
|
-
return int(obj)
|
|
209
|
-
elif isinstance(obj, np.floating):
|
|
210
|
-
return float(obj)
|
|
211
|
-
return super().default(obj)
|
|
195
|
+
return orjson.dumps(obj, default=_default).decode()
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
def _default(obj: Any) -> Any:
|
|
199
|
+
if isinstance(obj, np.ndarray):
|
|
200
|
+
return obj.tolist()
|
|
201
|
+
if isinstance(obj, (np.integer, np.floating, np.bool_)):
|
|
202
|
+
return obj.item()
|
|
203
|
+
if isinstance(obj, Enum):
|
|
204
|
+
return obj.value
|
|
205
|
+
raise TypeError(f"Object of type {type(obj).__name__} is not serializable")
|
phoenix/db/insertion/types.py
CHANGED
|
@@ -180,13 +180,11 @@ class Precursors(ABC):
|
|
|
180
180
|
def as_insertable(
|
|
181
181
|
self,
|
|
182
182
|
span_rowid: int,
|
|
183
|
-
id_: Optional[int] = None,
|
|
184
183
|
) -> Insertables.SpanAnnotation:
|
|
185
184
|
return Insertables.SpanAnnotation(
|
|
186
185
|
span_id=self.span_id,
|
|
187
186
|
obj=self.obj,
|
|
188
187
|
span_rowid=span_rowid,
|
|
189
|
-
id_=id_,
|
|
190
188
|
)
|
|
191
189
|
|
|
192
190
|
@dataclass(frozen=True)
|
|
@@ -197,13 +195,11 @@ class Precursors(ABC):
|
|
|
197
195
|
def as_insertable(
|
|
198
196
|
self,
|
|
199
197
|
trace_rowid: int,
|
|
200
|
-
id_: Optional[int] = None,
|
|
201
198
|
) -> Insertables.TraceAnnotation:
|
|
202
199
|
return Insertables.TraceAnnotation(
|
|
203
200
|
trace_id=self.trace_id,
|
|
204
201
|
obj=self.obj,
|
|
205
202
|
trace_rowid=trace_rowid,
|
|
206
|
-
id_=id_,
|
|
207
203
|
)
|
|
208
204
|
|
|
209
205
|
@dataclass(frozen=True)
|
|
@@ -215,14 +211,12 @@ class Precursors(ABC):
|
|
|
215
211
|
def as_insertable(
|
|
216
212
|
self,
|
|
217
213
|
span_rowid: int,
|
|
218
|
-
id_: Optional[int] = None,
|
|
219
214
|
) -> Insertables.DocumentAnnotation:
|
|
220
215
|
return Insertables.DocumentAnnotation(
|
|
221
216
|
span_id=self.span_id,
|
|
222
217
|
document_position=self.document_position,
|
|
223
218
|
obj=self.obj,
|
|
224
219
|
span_rowid=span_rowid,
|
|
225
|
-
id_=id_,
|
|
226
220
|
)
|
|
227
221
|
|
|
228
222
|
|
|
@@ -231,40 +225,31 @@ class Insertables(ABC):
|
|
|
231
225
|
class SpanAnnotation(Precursors.SpanAnnotation):
|
|
232
226
|
span_rowid: int
|
|
233
227
|
identifier: str = ""
|
|
234
|
-
id_: Optional[int] = None
|
|
235
228
|
|
|
236
229
|
@property
|
|
237
230
|
def row(self) -> models.SpanAnnotation:
|
|
238
231
|
obj = copy(self.obj)
|
|
239
232
|
obj.span_rowid = self.span_rowid
|
|
240
|
-
if self.id_ is not None:
|
|
241
|
-
obj.id = self.id_
|
|
242
233
|
return obj
|
|
243
234
|
|
|
244
235
|
@dataclass(frozen=True)
|
|
245
236
|
class TraceAnnotation(Precursors.TraceAnnotation):
|
|
246
237
|
trace_rowid: int
|
|
247
238
|
identifier: str = ""
|
|
248
|
-
id_: Optional[int] = None
|
|
249
239
|
|
|
250
240
|
@property
|
|
251
241
|
def row(self) -> models.TraceAnnotation:
|
|
252
242
|
obj = copy(self.obj)
|
|
253
243
|
obj.trace_rowid = self.trace_rowid
|
|
254
|
-
if self.id_ is not None:
|
|
255
|
-
obj.id = self.id_
|
|
256
244
|
return obj
|
|
257
245
|
|
|
258
246
|
@dataclass(frozen=True)
|
|
259
247
|
class DocumentAnnotation(Precursors.DocumentAnnotation):
|
|
260
248
|
span_rowid: int
|
|
261
249
|
identifier: str = ""
|
|
262
|
-
id_: Optional[int] = None
|
|
263
250
|
|
|
264
251
|
@property
|
|
265
252
|
def row(self) -> models.DocumentAnnotation:
|
|
266
253
|
obj = copy(self.obj)
|
|
267
254
|
obj.span_rowid = self.span_rowid
|
|
268
|
-
if self.id_ is not None:
|
|
269
|
-
obj.id = self.id_
|
|
270
255
|
return obj
|
phoenix/db/models.py
CHANGED
|
@@ -188,7 +188,7 @@ class JsonDict(TypeDecorator[dict[str, Any]]):
|
|
|
188
188
|
impl = JSON_
|
|
189
189
|
|
|
190
190
|
def process_bind_param(self, value: Optional[dict[str, Any]], _: Dialect) -> dict[str, Any]:
|
|
191
|
-
return
|
|
191
|
+
return value if isinstance(value, dict) else {}
|
|
192
192
|
|
|
193
193
|
def process_result_value(self, value: Optional[Any], _: Dialect) -> Optional[dict[str, Any]]:
|
|
194
194
|
return orjson.loads(orjson.dumps(value)) if isinstance(value, dict) and value else value
|
|
@@ -200,7 +200,7 @@ class JsonList(TypeDecorator[list[Any]]):
|
|
|
200
200
|
impl = JSON_
|
|
201
201
|
|
|
202
202
|
def process_bind_param(self, value: Optional[list[Any]], _: Dialect) -> list[Any]:
|
|
203
|
-
return
|
|
203
|
+
return value if isinstance(value, list) else []
|
|
204
204
|
|
|
205
205
|
def process_result_value(self, value: Optional[Any], _: Dialect) -> Optional[list[Any]]:
|
|
206
206
|
return orjson.loads(orjson.dumps(value)) if isinstance(value, list) and value else value
|
|
@@ -13,6 +13,7 @@ from phoenix.db import models
|
|
|
13
13
|
from phoenix.server.api.dataloaders.cache import TwoTierCache
|
|
14
14
|
from phoenix.server.api.input_types.TimeRange import TimeRange
|
|
15
15
|
from phoenix.server.api.types.AnnotationSummary import AnnotationSummary
|
|
16
|
+
from phoenix.server.session_filters import get_filtered_session_rowids_subquery
|
|
16
17
|
from phoenix.server.types import DbSessionFactory
|
|
17
18
|
from phoenix.trace.dsl import SpanFilter
|
|
18
19
|
|
|
@@ -20,27 +21,41 @@ Kind: TypeAlias = Literal["span", "trace"]
|
|
|
20
21
|
ProjectRowId: TypeAlias = int
|
|
21
22
|
TimeInterval: TypeAlias = tuple[Optional[datetime], Optional[datetime]]
|
|
22
23
|
FilterCondition: TypeAlias = Optional[str]
|
|
24
|
+
SessionFilterCondition: TypeAlias = Optional[str]
|
|
23
25
|
AnnotationName: TypeAlias = str
|
|
24
26
|
|
|
25
|
-
Segment: TypeAlias = tuple[
|
|
27
|
+
Segment: TypeAlias = tuple[
|
|
28
|
+
Kind,
|
|
29
|
+
ProjectRowId,
|
|
30
|
+
TimeInterval,
|
|
31
|
+
FilterCondition,
|
|
32
|
+
SessionFilterCondition,
|
|
33
|
+
]
|
|
26
34
|
Param: TypeAlias = AnnotationName
|
|
27
35
|
|
|
28
|
-
Key: TypeAlias = tuple[
|
|
36
|
+
Key: TypeAlias = tuple[
|
|
37
|
+
Kind,
|
|
38
|
+
ProjectRowId,
|
|
39
|
+
Optional[TimeRange],
|
|
40
|
+
FilterCondition,
|
|
41
|
+
SessionFilterCondition,
|
|
42
|
+
AnnotationName,
|
|
43
|
+
]
|
|
29
44
|
Result: TypeAlias = Optional[AnnotationSummary]
|
|
30
45
|
ResultPosition: TypeAlias = int
|
|
31
46
|
DEFAULT_VALUE: Result = None
|
|
32
47
|
|
|
33
48
|
|
|
34
49
|
def _cache_key_fn(key: Key) -> tuple[Segment, Param]:
|
|
35
|
-
kind, project_rowid, time_range, filter_condition, eval_name = key
|
|
50
|
+
kind, project_rowid, time_range, filter_condition, session_filter_condition, eval_name = key
|
|
36
51
|
interval = (
|
|
37
52
|
(time_range.start, time_range.end) if isinstance(time_range, TimeRange) else (None, None)
|
|
38
53
|
)
|
|
39
|
-
return (kind, project_rowid, interval, filter_condition), eval_name
|
|
54
|
+
return (kind, project_rowid, interval, filter_condition, session_filter_condition), eval_name
|
|
40
55
|
|
|
41
56
|
|
|
42
57
|
_Section: TypeAlias = tuple[ProjectRowId, AnnotationName, Kind]
|
|
43
|
-
_SubKey: TypeAlias = tuple[TimeInterval, FilterCondition]
|
|
58
|
+
_SubKey: TypeAlias = tuple[TimeInterval, FilterCondition, SessionFilterCondition]
|
|
44
59
|
|
|
45
60
|
|
|
46
61
|
class AnnotationSummaryCache(
|
|
@@ -61,8 +76,21 @@ class AnnotationSummaryCache(
|
|
|
61
76
|
del self._cache[section]
|
|
62
77
|
|
|
63
78
|
def _cache_key(self, key: Key) -> tuple[_Section, _SubKey]:
|
|
64
|
-
(
|
|
65
|
-
|
|
79
|
+
(
|
|
80
|
+
(
|
|
81
|
+
kind,
|
|
82
|
+
project_rowid,
|
|
83
|
+
interval,
|
|
84
|
+
filter_condition,
|
|
85
|
+
session_filter_condition,
|
|
86
|
+
),
|
|
87
|
+
annotation_name,
|
|
88
|
+
) = _cache_key_fn(key)
|
|
89
|
+
return (project_rowid, annotation_name, kind), (
|
|
90
|
+
interval,
|
|
91
|
+
filter_condition,
|
|
92
|
+
session_filter_condition,
|
|
93
|
+
)
|
|
66
94
|
|
|
67
95
|
|
|
68
96
|
class AnnotationSummaryDataLoader(DataLoader[Key, Result]):
|
|
@@ -102,7 +130,9 @@ def _get_stmt(
|
|
|
102
130
|
segment: Segment,
|
|
103
131
|
*annotation_names: Param,
|
|
104
132
|
) -> Select[Any]:
|
|
105
|
-
kind, project_rowid, (start_time, end_time), filter_condition =
|
|
133
|
+
kind, project_rowid, (start_time, end_time), filter_condition, session_filter_condition = (
|
|
134
|
+
segment
|
|
135
|
+
)
|
|
106
136
|
|
|
107
137
|
annotation_model: Union[Type[models.SpanAnnotation], Type[models.TraceAnnotation]]
|
|
108
138
|
entity_model: Union[Type[models.Span], Type[models.Trace]]
|
|
@@ -144,6 +174,19 @@ def _get_stmt(
|
|
|
144
174
|
entity_count_query = entity_count_query.where(
|
|
145
175
|
cast(Type[models.Trace], entity_model).project_rowid == project_rowid
|
|
146
176
|
)
|
|
177
|
+
else:
|
|
178
|
+
assert_never(kind)
|
|
179
|
+
|
|
180
|
+
if session_filter_condition:
|
|
181
|
+
filtered_session_rowids = get_filtered_session_rowids_subquery(
|
|
182
|
+
session_filter_condition=session_filter_condition,
|
|
183
|
+
project_rowids=[project_rowid],
|
|
184
|
+
start_time=start_time,
|
|
185
|
+
end_time=end_time,
|
|
186
|
+
)
|
|
187
|
+
entity_count_query = entity_count_query.where(
|
|
188
|
+
models.Trace.project_session_rowid.in_(filtered_session_rowids)
|
|
189
|
+
)
|
|
147
190
|
|
|
148
191
|
entity_count_query = entity_count_query.where(
|
|
149
192
|
or_(score_column.is_not(None), label_column.is_not(None))
|
|
@@ -186,6 +229,15 @@ def _get_stmt(
|
|
|
186
229
|
else:
|
|
187
230
|
assert_never(kind)
|
|
188
231
|
|
|
232
|
+
if session_filter_condition:
|
|
233
|
+
filtered_session_rowids = get_filtered_session_rowids_subquery(
|
|
234
|
+
session_filter_condition=session_filter_condition,
|
|
235
|
+
project_rowids=[project_rowid],
|
|
236
|
+
start_time=start_time,
|
|
237
|
+
end_time=end_time,
|
|
238
|
+
)
|
|
239
|
+
base_stmt = base_stmt.where(models.Trace.project_session_rowid.in_(filtered_session_rowids))
|
|
240
|
+
|
|
189
241
|
base_stmt = base_stmt.where(or_(score_column.is_not(None), label_column.is_not(None)))
|
|
190
242
|
base_stmt = base_stmt.where(name_column.in_(annotation_names))
|
|
191
243
|
|
|
@@ -25,6 +25,7 @@ from phoenix.db import models
|
|
|
25
25
|
from phoenix.db.helpers import SupportedSQLDialect
|
|
26
26
|
from phoenix.server.api.dataloaders.cache import TwoTierCache
|
|
27
27
|
from phoenix.server.api.input_types.TimeRange import TimeRange
|
|
28
|
+
from phoenix.server.session_filters import get_filtered_session_rowids_subquery
|
|
28
29
|
from phoenix.server.types import DbSessionFactory
|
|
29
30
|
from phoenix.trace.dsl import SpanFilter
|
|
30
31
|
|
|
@@ -32,13 +33,16 @@ Kind: TypeAlias = Literal["span", "trace"]
|
|
|
32
33
|
ProjectRowId: TypeAlias = int
|
|
33
34
|
TimeInterval: TypeAlias = tuple[Optional[datetime], Optional[datetime]]
|
|
34
35
|
FilterCondition: TypeAlias = Optional[str]
|
|
36
|
+
SessionFilterCondition: TypeAlias = Optional[str]
|
|
35
37
|
Probability: TypeAlias = float
|
|
36
38
|
QuantileValue: TypeAlias = float
|
|
37
39
|
|
|
38
|
-
Segment: TypeAlias = tuple[Kind, TimeInterval, FilterCondition]
|
|
40
|
+
Segment: TypeAlias = tuple[Kind, TimeInterval, FilterCondition, SessionFilterCondition]
|
|
39
41
|
Param: TypeAlias = tuple[ProjectRowId, Probability]
|
|
40
42
|
|
|
41
|
-
Key: TypeAlias = tuple[
|
|
43
|
+
Key: TypeAlias = tuple[
|
|
44
|
+
Kind, ProjectRowId, Optional[TimeRange], FilterCondition, SessionFilterCondition, Probability
|
|
45
|
+
]
|
|
42
46
|
Result: TypeAlias = Optional[QuantileValue]
|
|
43
47
|
ResultPosition: TypeAlias = int
|
|
44
48
|
DEFAULT_VALUE: Result = None
|
|
@@ -47,15 +51,18 @@ FloatCol: TypeAlias = SQLColumnExpression[Float[float]]
|
|
|
47
51
|
|
|
48
52
|
|
|
49
53
|
def _cache_key_fn(key: Key) -> tuple[Segment, Param]:
|
|
50
|
-
kind, project_rowid, time_range, filter_condition, probability = key
|
|
54
|
+
kind, project_rowid, time_range, filter_condition, session_filter_condition, probability = key
|
|
51
55
|
interval = (
|
|
52
56
|
(time_range.start, time_range.end) if isinstance(time_range, TimeRange) else (None, None)
|
|
53
57
|
)
|
|
54
|
-
return (kind, interval, filter_condition), (
|
|
58
|
+
return (kind, interval, filter_condition, session_filter_condition), (
|
|
59
|
+
project_rowid,
|
|
60
|
+
probability,
|
|
61
|
+
)
|
|
55
62
|
|
|
56
63
|
|
|
57
64
|
_Section: TypeAlias = ProjectRowId
|
|
58
|
-
_SubKey: TypeAlias = tuple[TimeInterval, FilterCondition, Kind, Probability]
|
|
65
|
+
_SubKey: TypeAlias = tuple[TimeInterval, FilterCondition, SessionFilterCondition, Kind, Probability]
|
|
59
66
|
|
|
60
67
|
|
|
61
68
|
class LatencyMsQuantileCache(
|
|
@@ -71,8 +78,17 @@ class LatencyMsQuantileCache(
|
|
|
71
78
|
)
|
|
72
79
|
|
|
73
80
|
def _cache_key(self, key: Key) -> tuple[_Section, _SubKey]:
|
|
74
|
-
(
|
|
75
|
-
|
|
81
|
+
(
|
|
82
|
+
(kind, interval, filter_condition, session_filter_condition),
|
|
83
|
+
(project_rowid, probability),
|
|
84
|
+
) = _cache_key_fn(key)
|
|
85
|
+
return project_rowid, (
|
|
86
|
+
interval,
|
|
87
|
+
filter_condition,
|
|
88
|
+
session_filter_condition,
|
|
89
|
+
kind,
|
|
90
|
+
probability,
|
|
91
|
+
)
|
|
76
92
|
|
|
77
93
|
|
|
78
94
|
class LatencyMsQuantileDataLoader(DataLoader[Key, Result]):
|
|
@@ -113,11 +129,18 @@ async def _get_results(
|
|
|
113
129
|
segment: Segment,
|
|
114
130
|
params: Mapping[Param, list[ResultPosition]],
|
|
115
131
|
) -> AsyncIterator[tuple[ResultPosition, QuantileValue]]:
|
|
116
|
-
kind, (start_time, end_time), filter_condition = segment
|
|
132
|
+
kind, (start_time, end_time), filter_condition, session_filter_condition = segment
|
|
117
133
|
stmt = select(models.Trace.project_rowid)
|
|
118
134
|
if kind == "trace":
|
|
119
135
|
latency_column = cast(FloatCol, models.Trace.latency_ms)
|
|
120
136
|
time_column = models.Trace.start_time
|
|
137
|
+
if filter_condition:
|
|
138
|
+
sf = SpanFilter(filter_condition)
|
|
139
|
+
stmt = stmt.where(
|
|
140
|
+
models.Trace.id.in_(
|
|
141
|
+
sf(select(models.Span.trace_rowid).distinct()).scalar_subquery()
|
|
142
|
+
)
|
|
143
|
+
)
|
|
121
144
|
elif kind == "span":
|
|
122
145
|
latency_column = cast(FloatCol, models.Span.latency_ms)
|
|
123
146
|
time_column = models.Span.start_time
|
|
@@ -127,6 +150,15 @@ async def _get_results(
|
|
|
127
150
|
stmt = sf(stmt)
|
|
128
151
|
else:
|
|
129
152
|
assert_never(kind)
|
|
153
|
+
if session_filter_condition:
|
|
154
|
+
project_rowids = [project_rowid for project_rowid, _ in params]
|
|
155
|
+
filtered_session_rowids = get_filtered_session_rowids_subquery(
|
|
156
|
+
session_filter_condition=session_filter_condition,
|
|
157
|
+
project_rowids=project_rowids,
|
|
158
|
+
start_time=start_time,
|
|
159
|
+
end_time=end_time,
|
|
160
|
+
)
|
|
161
|
+
stmt = stmt.where(models.Trace.project_session_rowid.in_(filtered_session_rowids))
|
|
130
162
|
if start_time:
|
|
131
163
|
stmt = stmt.where(start_time <= time_column)
|
|
132
164
|
if end_time:
|