From ff4bfee4d9c29769e3ad24ab3a86e1edb16f9120 Mon Sep 17 00:00:00 2001 From: Julian Bez Date: Mon, 20 Nov 2023 12:26:08 +0100 Subject: [PATCH] feat(queries): Add possibility to run queries async (#18571) --- ee/clickhouse/test/test_client.py | 129 -------- ...ickhouse_experiment_secondary_results.ambr | 2 +- ...sights--funnel-left-to-right-breakdown.png | Bin 120986 -> 120897 bytes ...ipeline--pipeline-transformations-page.png | Bin 128268 -> 129087 bytes frontend/src/lib/api.ts | 17 +- frontend/src/lib/constants.tsx | 1 + .../queries/nodes/DataNode/dataNodeLogic.ts | 2 +- frontend/src/queries/query.ts | 44 ++- frontend/src/queries/schema.json | 45 +++ frontend/src/queries/schema.ts | 22 ++ package.json | 2 +- posthog/api/insight.py | 10 +- posthog/api/query.py | 184 ++++------- posthog/api/services/__init__.py | 0 posthog/api/services/query.py | 97 ++++++ posthog/api/test/test_query.py | 135 ++++++--- posthog/caching/calculate_results.py | 2 +- posthog/celery.py | 25 +- posthog/clickhouse/cancel.py | 14 + posthog/clickhouse/client/__init__.py | 4 +- posthog/clickhouse/client/execute_async.py | 286 +++++++----------- .../client/test/test_execute_async.py | 152 ++++++++++ posthog/schema.py | 18 ++ posthog/tasks/exports/csv_exporter.py | 2 +- posthog/warehouse/api/test/test_view_link.py | 2 +- .../models/datawarehouse_saved_query.py | 2 +- 26 files changed, 686 insertions(+), 511 deletions(-) delete mode 100644 ee/clickhouse/test/test_client.py create mode 100644 posthog/api/services/__init__.py create mode 100644 posthog/api/services/query.py create mode 100644 posthog/clickhouse/cancel.py create mode 100644 posthog/clickhouse/client/test/test_execute_async.py diff --git a/ee/clickhouse/test/test_client.py b/ee/clickhouse/test/test_client.py deleted file mode 100644 index ab5ba1b4a53e0..0000000000000 --- a/ee/clickhouse/test/test_client.py +++ /dev/null @@ -1,129 +0,0 @@ -from unittest.mock import patch - -import fakeredis -from clickhouse_driver.errors import ServerException -from django.test import TestCase - -from posthog.clickhouse.client import execute_async as client -from posthog.client import sync_execute -from posthog.test.base import ClickhouseTestMixin - - -class ClickhouseClientTestCase(TestCase, ClickhouseTestMixin): - def setUp(self): - self.redis_client = fakeredis.FakeStrictRedis() - - def test_async_query_client(self): - query = "SELECT 1+1" - team_id = 2 - query_id = client.enqueue_execute_with_progress(team_id, query, bypass_celery=True) - result = client.get_status_or_results(team_id, query_id) - self.assertFalse(result.error) - self.assertTrue(result.complete) - self.assertEqual(result.results, [[2]]) - - def test_async_query_client_errors(self): - query = "SELECT WOW SUCH DATA FROM NOWHERE THIS WILL CERTAINLY WORK" - team_id = 2 - self.assertRaises( - ServerException, - client.enqueue_execute_with_progress, - **{"team_id": team_id, "query": query, "bypass_celery": True}, - ) - try: - query_id = client.enqueue_execute_with_progress(team_id, query, bypass_celery=True) - except Exception: - pass - - result = client.get_status_or_results(team_id, query_id) - self.assertTrue(result.error) - self.assertRegex(result.error_message, "Code: 62.\nDB::Exception: Syntax error:") - - def test_async_query_client_does_not_leak(self): - query = "SELECT 1+1" - team_id = 2 - wrong_team = 5 - query_id = client.enqueue_execute_with_progress(team_id, query, bypass_celery=True) - result = client.get_status_or_results(wrong_team, query_id) - self.assertTrue(result.error) - self.assertEqual(result.error_message, "Requesting team is not executing team") - - @patch("posthog.clickhouse.client.execute_async.enqueue_clickhouse_execute_with_progress") - def test_async_query_client_is_lazy(self, execute_sync_mock): - query = "SELECT 4 + 4" - team_id = 2 - client.enqueue_execute_with_progress(team_id, query, bypass_celery=True) - - # Try the same query again - client.enqueue_execute_with_progress(team_id, query, bypass_celery=True) - - # Try the same query again (for good measure!) - client.enqueue_execute_with_progress(team_id, query, bypass_celery=True) - - # Assert that we only called clickhouse once - execute_sync_mock.assert_called_once() - - @patch("posthog.clickhouse.client.execute_async.enqueue_clickhouse_execute_with_progress") - def test_async_query_client_is_lazy_but_not_too_lazy(self, execute_sync_mock): - query = "SELECT 8 + 8" - team_id = 2 - client.enqueue_execute_with_progress(team_id, query, bypass_celery=True) - - # Try the same query again, but with force - client.enqueue_execute_with_progress(team_id, query, bypass_celery=True, force=True) - - # Try the same query again (for good measure!) - client.enqueue_execute_with_progress(team_id, query, bypass_celery=True) - - # Assert that we called clickhouse twice - self.assertEqual(execute_sync_mock.call_count, 2) - - @patch("posthog.clickhouse.client.execute_async.enqueue_clickhouse_execute_with_progress") - def test_async_query_client_manual_query_uuid(self, execute_sync_mock): - # This is a unique test because technically in the test pattern `SELECT 8 + 8` is already - # in redis. This tests to make sure it is treated as a unique run of that query - query = "SELECT 8 + 8" - team_id = 2 - query_id = "I'm so unique" - client.enqueue_execute_with_progress(team_id, query, query_id=query_id, bypass_celery=True) - - # Try the same query again, but with force - client.enqueue_execute_with_progress(team_id, query, query_id=query_id, bypass_celery=True, force=True) - - # Try the same query again (for good measure!) - client.enqueue_execute_with_progress(team_id, query, query_id=query_id, bypass_celery=True) - - # Assert that we called clickhouse twice - self.assertEqual(execute_sync_mock.call_count, 2) - - def test_client_strips_comments_from_request(self): - """ - To ensure we can easily copy queries from `system.query_log` in e.g. - Metabase, we strip comments from the query we send. Metabase doesn't - display multilined output. - - See https://github.com/metabase/metabase/issues/14253 - - Note I'm not really testing much complexity, I trust that those will - come out as failures in other tests. - """ - from posthog.clickhouse.query_tagging import tag_queries - - # First add in the request information that should be added to the sql. - # We check this to make sure it is not removed by the comment stripping - with self.capture_select_queries() as sqls: - tag_queries(kind="request", id="1") - sync_execute( - query=""" - -- this request returns 1 - SELECT 1 - """ - ) - self.assertEqual(len(sqls), 1) - first_query = sqls[0] - self.assertIn(f"SELECT 1", first_query) - self.assertNotIn("this request returns", first_query) - - # Make sure it still includes the "annotation" comment that includes - # request routing information for debugging purposes - self.assertIn("/* request:1 */", first_query) diff --git a/ee/clickhouse/views/test/__snapshots__/test_clickhouse_experiment_secondary_results.ambr b/ee/clickhouse/views/test/__snapshots__/test_clickhouse_experiment_secondary_results.ambr index f039a2994204e..262c4a8e1e195 100644 --- a/ee/clickhouse/views/test/__snapshots__/test_clickhouse_experiment_secondary_results.ambr +++ b/ee/clickhouse/views/test/__snapshots__/test_clickhouse_experiment_secondary_results.ambr @@ -1,6 +1,6 @@ # name: ClickhouseTestExperimentSecondaryResults.test_basic_secondary_metric_results ' - /* user_id:126 celery:posthog.celery.sync_insight_caching_state */ + /* user_id:132 celery:posthog.celery.sync_insight_caching_state */ SELECT team_id, date_diff('second', max(timestamp), now()) AS age FROM events diff --git a/frontend/__snapshots__/scenes-app-insights--funnel-left-to-right-breakdown.png b/frontend/__snapshots__/scenes-app-insights--funnel-left-to-right-breakdown.png index f90c93d7e84d0f1bb4ac92c10022d72e1dd1528b..b899e5e48f727e4c0213a811d5c665760d22db28 100644 GIT binary patch delta 81286 zcmb@ucU+U(@;(Z7MP+Xl5fo4fB7&mQq^l@ZQ0Ya83WQz+>E#6#J0PJ+S7`zPgixeo zp-GcY=+Ytd-U4^t;NEAS-}!#ey`Oupe?WxfU2DynnKjQd&muH!=a)}AKTW(rST&rw zDI0v+(n*GoPP(!0K6PGxXixc6WWheAYs@3yvW^-q3UbCh_8No+IM*T={Gd~&tz zS*7GVj*=4z-wrf9!`EZ@?TA-)^;|y2vpc!DaI)Rl9eK@PuW1_-9b!9Jb*u>6GGI2w zS6?OG?24PCbPW~CD4y;7a<1#X)v3|1npX);B7Bw|iFAWN%2+txz;}?WK z2S(DBTzC4S@=N~JtVVvp##&jip^ood8n2v=kU|$9etv8#9XarDshR0#1;Rre`td;b z>D;-;j9cS{b#1*e7FFuHd1(k3cJ`k?>GPjHl^kf5?Jkxrx6rhRT^w&JM9#U+u321@ zj2qC4swJtO>K-F7>*O}tS8Ro%DG?;DZeoCYf_G_Ksk4@c`BR5>Oil-PG6basYm-(>ZY;0q^6Ab zISMx=SLqC6TmpmrW2>t81^Df}T&ojS1OtOZR`)hrk1}6v>CV@3(H@BPY@e-Bd&K@K z?w*Tt?In%jy*a`mKYrY3=;`^mhpu_shO8&!HMt*^70T+kQ1@A!LOHT{u8Xbbh8u+) zHGI6}y1TCPw3CQ~!gXtwH-3pTSF2YjE7LdiS_X5@jSPCnCb}f)#*enoWmVT%3>yum zr7S$?A2c{4epYRt_j^%VLH@IAqM<`yWj2QI55UibI92i_(rtDY=JHGp^(NORx5zE7 zne{~9iYewiaHwB)91*9(YKXVI*83$xd=k@D_oG7S!c?x?cgyqa8%14ra0L*r$!ab#XXfN zJ-gb8;i`zHtIu&#oglLIi&enO71PTJY1gp^h`pm zZ(Uq>YR#dF+7tCQvDuw@~f<-_5h?>Q7`&*hC>l&e2@Q|v?(?|Fr_WGgoX<-5p}l9G{EyoDcwvF=(? zs~tm)U0vs*YUAk^-Nt}+(>hk&60b*!xJ;^*sZRpSUv2=E_q7|u?==!eL7#yZMV`gxt5)h z+Z*wt>V}FkUPi-Q5{vp>gjiEzq353kOGzS>#f`%EEWzg9ONCKx>xPu9g}ILL?e;(N zd-0czgd~M@oN}~Qx`;)$9BSWmEm^!O-1w#;RVXRSt;^~=7bc`5AaNl!2IFggCs$3z zm!itqWvq;B6n``&x6haRv5hX(ZjJB6a5z0&<`^O;Y%JPR2CIwpotB%N3)V~veqCxY zFe)c2*70JKRp3*jM@8n?Hs+HI*}}^D>V(67%*|q(N5gY=Tv1d@Ys*_{Y7oj8({|&l z5^HXf@agZzSRl1I&b{48ijdjOB;>AYYC+e>D5M}`NIqI_z+1>{!N%3^reAJ2_#?2vHkS>mqWw{r_ya5^*2lB`Oc`&EQ@U;5D4 zctU*jU;=I+`65m6#o)EB_NL~#)L^{}?nNRE3aO1|cdb*!FST9KKwO}CN6Gj_u!iVS}8ntLbRB62)=jrl>}v)IG~BTYiFEXWDU`q_G9oyU5x z80*e6B_OQj+5M$x{p`qStz2Hwsqv`xy=w(^$mN?=nC}O+a-CN}Dx)?$*Jr&n?D~f{ zj9u?5UpKRzf6vX^=rwuA@kIVy!4Mb1B`nvy>dW|;En(UyuZvOb{c0JTyKmuYRc)i> zA4_k)NmBe5O=dfAN5F-RS_*G=i!Z3Sjc-UqLvD2IS(*)w-~=CUaUB+4nMjM; zA*nrpUkvBAGJP3|{8F1=pyw9iRA|q#{OPk;p#LlFj%y@dOipBhjn~xL5xJo@;FUY! z%UdTYu@?SoqfRku$xZyhSiJMPmxh|U@;jE`LaA=2QO-(rHU zWGcCHeIDdu#<7x3*~$WgvF`!`4BQq&qD%}PUR7hb-sUtvIgDl9xIJYy=6H^Pspe++ ztd%=p6-!RtKel@+Awn6K`w;2Qj)}8Rh&li1#jhcW+?96hNLH5R{&3-`SR`O&M=V`8 zYb$0u&HVvimUg zE?A#_iftD|uz6sae@t|ld!k?6ZnYrB(V&~UEMk>E6BnaLf7r?2yoof$rQ>@_O=s0t z^|<9249(`>C!K5b-&nWxey#K|*EHgnv~HT?O@Y~UwvkCy-Ok7IFMl!T)z>S>#>8wB zVlp?;y2K90{l3oK$l^pNKBlVb24z-qgIKsepGr28Tn)kDa2al^_Twa?Ol&Nji?aC2 zaCBlqLft^{PWx+03W!3(I%U;vvS9HHAD?YS{dVrwKypi$aU&#@M_M66^Kr(Nr56hp zoTCM;PG_#=ST#+C`gJUZ)c&gE74Dug)3{$k!7i4yv;T1TP&mOvVI#~j`vsn0p_ty) zpW1M`9vZTnhvRdf%6pfmZnJlL%zHQ1W9O=TV?V4FPfj8QGf4dV(tW<&V~?D|!bR-l zb+XJK*z9^LlDlIr6LFSaWL4DEh6|xNuIsAaZ&ARp{Hd%~-busoQ6HX+DW0QCQZ@D+P+o zzV4pBb(FJ;Xdnbd@JR)cjgHtb%`G(dli=`0=1KG; zUy${il=cS6x>?@*#My53*z_EVOIzFO+=^9LljQltxs1jq=T3SMOGrUx?k(R*FZp%_ zePP-*ZRUDkzP4xz>W%ip`}X^CL8vf>Ya~myPM?d7Lr$f-Zl$4V_r7^!WT{qZG*)Aj z|NJFp8(lripmWYGr*vmrhIUBS9J#zEs$)|<8ESo1tg)1T7Y&Wac$>%yzXWUR-ZSjq z!hZ6-qS;a|a5vfUqqo+58X6jNnO`)Y>2r2;aNd&``~!YKL(}?f2QBr*yDQXhG{*3A z1bta|eDen%e*fay*i04GCv#tVNOaf8970H zN6%Zwx0j4w{O366Z~v!ZsN?^~ILzCqPrHmR6#jV}AYA#`+#KhNto60!+9j2imR?N> z3k|K;b?A(RszNhZ*FJ>Red%69%PPfvygmD7d$tw5uzTP7q6wlV(_vC?U}&gp<~`LIf7tG}-Qig~)F8R`O>)>jYONnn zhUlAXRJl1a8?}*tE_e8(?t>DB+=VtXySd@pDlIo5{uS`@3JL?W%l(V1^F5F0NAqWE z8U})~ta&?kQPOSrz4N3s16?=Unmk9 zsy*$T+LFXBK$PEA5!`(c`z zn$S4LXE@E`oWxiGgj6C!vvPPri?*1U7>ocvzp=BkwxpA|&P_I6HMb<0Z~6+8?2!gW zOKLfm%4{x3l*F1u>K-~ef%E6zrKFr|S~s{{;a z2O@0cJmJ9@xy0n;ChmBhxiu?2jiIUMrE#ZNSVv|q7MPr=tZhJi&JGPn7zS!*TSm;x z%rrJML{G#cu?aF*|Ii)$qGAJcw}J!1{ZCB}+Rb1W1v#+VXTeybqo&KQ5>ybStgM`I z@7s=LihEOYvpgRDJ(A2T(VAPO%s7gDL1aP|y9qLe0|GOc*pHc+YAPz88)YwF?um_a zZtCiadx5;zEvKxdl~Z3|-$)|;*>Ni~BSRGhtLw9mXlRbp$X&al3YbGBT0a^egYP|H zXn;%1%hO?J|AvpTBR6w#bL)tUcQUi?KgNCLjI#X#^Zfk0skQYje1^Tndm9@Ye$h_0 z4%y6i?=I)$I59Ib-$Jmd$|^WD)wgW;YON?NVwP?b7^U&<*RMb4A37-P$@e*Y_^_$L zL)A`QUHlgB#t$D(dVBjO5TjMx<+QXy&gf|n3RCW7W@pRc>-jFKYAb(8NZ^W)aMQ-4 zyPlqYvAU}2V{Ghod_ZVuBCNA|$<@@vGICWbE-^j*>WG7}Zi7=RBwhOZ7GX)WW7)O1zYD^la)aMdfWcp2@YLTx!YIa3ppx~i&-HTQ(XM0sEY zOfAHdVPq#UB42F!+v!sn3ii+A| zdnrflkag_?V(qGDou1;28|B1dO&6KGQ=FWzXtfrChO=|7wvLW~px~*f?$loV0jGxg z#=5#c%U@%WGhF)&;-aHf`heOol8|Bgk~+J(H8qflX(Z9gw7Ipz%<#d37Z>^Xz&i~` zTSIcHe*9=$ntJ~9*|ULZ+3VNI0TB_&6BCx+KCe#;S46)|w}G@F&BDS0zJ{MH^PWM- zLZJzhepaUoyEpus9b@O6X1W|b<=6X9Lh4M4N8)AN+}!Y6CQmFcFOQCot65p4ViG=m zx&?XVL|Jo+Zc?UM%Tw{@mX`R)$jCSPkjqCSUFf+^pT2eP-un^#*-1HkKvYyJ_-RAg zj-5N3NF*)*_>~R0c4U5j{um#h{c_5dmMJe^y;5X5%F3$l;*u9rY;a#r?!|~cJ3BjK zYDSmOm;!T-jg1A**jLDiGcrmd5US?V($X$uW@X9a)6>&c_4F)PT9=j_rznC@=)>s% zmBp>uj#Ue3>8EG7xfR*M!oyWnRQxeq;^Mk$YHD%5ii(N}X=%5Wdlo$b(V9VG+qZ8Y z{*dd&c^7jWPTHzqJ}9Pm5;*{rOPsHli!U51YPz}+7%pL9ElBA6Zaf{UVI=+fuP)($ z?*^;GqDFY!r$=l<)d_!s$ou`SLh-G%*Py zhw?glF5?0$!ZrpaFFZ#ZCwE(sZA^l2X=`AMgCw zhI|x7M`!Y@AicZXO3y-ZH?nL_WL+D(8P0O+iNtD;%lrhrx*Xo!b!K1Z{P)|>WDbQ; zkaUIMNS8>ANskL>qxCoa{l2F!3Usf1o{>lwNNjhUtroJY5gxi`ceH`8zV%vvwYK{l|%Aac|+crjoq;%aoi! zX7Q=wtfpraz=apmFGc-$Zz*GA$wnEYAZ%jpe#0TGdw&d2EV z5#OjG2TZTw7%YMLL>SEB?rIN8n` zQwKk)SYh2MbAW}rly!V>ET%dl!u%!T&xilT!@4>~SeB0e{o4G~J+jvHML|A1x3B)X zjs0z62$0gcNbxqJ(apK7dR~s*ws(bJl}WG;x$NgLnr@Zh>~pF9Wpmiq&HgmdF2dRd(@xK<`CQ9?9bqp0%p9*s zb4lf^z%H7*0tC$=bBrFHZ_~^6uitJhXFNEOQu&JkWcZ7PqukS-@kTf7&l z(K{B?Wgo9||M`-hPyfb~Uj5|@rKai^+eor5dobC@!xa1!^$iZv+($>yAofPzA8Q@& zFjYFlW?v(Fu56{VhA|ZzM0gvR5q;U_XnKx^`BND|+T#mQfFsrdMcq~-Hw^j1&qxpk zRj2P|8rzErHmJJI+jmv(-9xWm!@$~1(8;omm?wFdYd=O! z@#z56=$~jyo?RF+!bC@T2aIVM?OWZP*5$`E9!VS=93^9gr^Q|it2lmg7moC+ZekBJ zIEc`UNu$5E=*lN8tiD@1Ke+Zf=KIRP5||DBJY8lXGp?PMsCs>YYJ$BHffgX$=EEi>cCXrlR(tyIc*QNpy0$>fLrh?F`eeYhpD$lhP1uc zeqFG-SIR5V!ke03!+d~r=QXX142i*S%5nVY+;-E{y$6(Z`2Es(-1rXj>5JS9B`S7qoK;U ziM8?4N}r*mqGKUPqPR^j3s&G_Q2#~on+DMacH)d!kiV>#jANQ+(XmdYG5b`a{nqrH zL)51q7yQd~(M#tKxA(FicW>csFRE!%EFavmxlD5~hQ|>w>!-)aL9b^l1Z%_(tgyIASvedDfkzD9n7&uLVo2Ce%GgiBgwfn(80wCoEtZBe>fu-+m&9vf zNp6#B4kF%!u*93{@;8co3aAmI(IG}hN0AR* z;L|TrpGMtaP}PtOo_T`md7iM|YtO%a({!zpO?O{5zb@$Qr$|$5LtUS!;8lfyUj5hy zr{t&8>MtEMq|AK1bi%KC;Ef_YUx~T|LdUM^(cW(fwbt3WOV*=&9m$b_85?{ZX-7zR zUZTEZ&5S_Uq`;AWaQ+5IiHsvUiyHa12Z=K?WCA>`r2G_Vn}_2SG(@1>FEe20=ldO~ zX~$RQE0uY09NrUb2S^!PH@Ef}B#XQ3ux7v7&{EWMM2YOIZ>ZU!Mvv;KrlyJPiwe{C zcvcz``t*^q+42@Gsgq%KC#gy5nh(0k?Vs*RRZYAC56Uzn^xdP_@RO5ZHnN)!B2cHJ zmG)>{k$D{!FtDm@y!)P!YeW;Rs%4U?Gg7p~}F?&Lt z9BCU3k!t%S!K#n6gPD_lh3vbUe(#{1-WjIZ;58n7$%*GnkkD-(X4X+5L;<*G)GGMp;U5ku+PB*q`l}FhJX*kpqjrkcdTRQbcbX3r#+}Q zq27L;8cR@{3X4BE&bfzP^wMp|Coj9_D+ilVud&}e+TOy>c_gW6Xo!k$d+BRQ(jZi%L6V1&kDk{_jNI18-{#S_a@XdH1U#*HwFH}Ds_6tURehf84^Ut4m zNz%r+^I(cxyXNU!chVRK*qUoIi_F2=Jhp=eY8BDyh>bb2R&(5cfo2eJr5d1+s1C>s zyCiCFi0x@y85o$10w+BY#?Ah(^BB<}>O(@~k{B!t31eAb*?biuinOP7OuLRyuIJT= zoNwO^=OFtP$eh#=YU}ThG2{z;@hL4NiY4Ep!q*9p{Liq_qtD9s#E4eAu9P=Je^G(Y_Li zR)}lgQBw-xGSjnJO``saGo1zU7wq5ak_SwD%BOb87a}g3Xi5 zh!JW_V{>y=1Swjd;oVR+G&Dr;F_Igzk}WX)ZxRZnt9(Q!eqLwP#mN1|RgHJ#s6ev= z9|Jr^PmAPI&ts9v{Mm=g1HqyTpJ}e~cK#BGRfPx+kX4;X}SwtSnvMra(sOsn>4Mn;r$@sF`jh>+WRK7A#X34>Bo*}b@kU#^$iy{Vm zBAX$2x&Kbx@$&NWpWPdjZgP;0Wt~vbvZ98ek~oP(3JnRVYitaF zqTA<~@CRt35A^pBuaHw)3f)#SaMhu$l1FHQ(%}payybYrHf~CDjWmpBAmR_PHlGMf zk`b(cbGjP#d1S<-(`hIIb*=dqH(js#`};fhc7CV7cVw-b|(Az-IJ>aa2^mCn4BG&iwKAv zyQHqF8Z$N~FiIvj_4K^Mn2fhw1+yE!E5cH?dU~tU&Cmse1;>B+as|jOdHjsctg6=>q$A+ za!HMi1QMyZb|T-lD-O6#p!JM#r#?L)q^ARY#f66a+}v7i3Zk5lkU%A``eQH&`T2MB ztlB!#yrPCO5Oo%o2xd06uvJpvzcW|d+}tYS;^IbYW9d+nFs_keTO7;dUK5!n3No^? z1ef@*;lHvXi`C_ungoD^G&MDEBp`y0JVNc!adFb~_S=1$R9j?OeM7^-9wAzw4GAjq zH&|&s${8lm7v_f&bEz@?{cnca*2qsn^p#&SA3fUCdCaj;RbBm@bEMKv-+@C0iNIw> z6nN@01P010%GHfD#7pVD`YIV!aL>1ilJ%e>ZDGM)@kW*8WF_!|xY4%($<58`nGYT0 zfbOmgh>Xm_@LdPOXBZj2wdm+Fr70~f{np&@Bax`0ukYFNqZgP?94?VaG^>O*kfnE-YNn~>#T5Ge(_SryZGPaQL5D6RK)YPZ8 z_N}!Q;o-*u0|MSk2wuDhY=NMh=VBf7VId(25H>*3eRP_j2(q(FA%TH`z!fPeK~GK&8rzy`YJnsAa7=&kHg2e| z&v2(WL$0rF62-TW)$HstNA!WUcP1xiW45~o15J1VXd;)!u`vSF(ipjlii)<+528o( ze|2?NvHBnG>Jwx26}0L)X2YZBxHdcadA~5q##c)yTNN(Hr4%e^BcSlHg&788C{xcQ z8ySn1t{2SJE6l7?+6vwB_Opt8OiIa>$3KJy;V7^s4Swu0kFr%Dta)93(d9xK&M<2^ zC%)Y8kFxBY4&BLpWxm|dL`Zy)5;OWZt1EvzG-}@+_r%fmn*A7gUw$m7T-$?TrDrk+ zBG@KGPs<_B9E-2^`(i{Une&AbCy{^AL}w#@`L?Gegf!WtAC@pHh&RNHwX~xDzi6BP zrB-|L$gYiwi|>i}=^S_APs`eO$Hf7iK#|sVqRo7ZwGTt)gN!>5c3d$rNk}IW=YLAk zkLa_lzKx5En?ofjfL`_*m|=%_RumgGA1P@DclsBeqvcfS?IA?a+P4YWPRD8 z%gJaepe!ipaAs!acA<0I-Z&DvcAdQqT!BgW3n)(I`|hkP4=anMVE0Sb5Ra1f0*1n( zcsvTuJFo-V8!24KOdY9RAFD+<@oq|IcT;fD+CWdsSXY4#5*;0#I}oJPKksbUpeTg) zoW79R;9%0V{<1xH>MI?GoKT1L{(5at}%n2J7ZDQ+EEpaZ{G9y3Gg* zfB2}C@^rC)+N5aL^nSG4`?TdB42=uLTd3>E%%r%>f-z7uL5R#uZgReY(nhX zA6ve^_^RLa^>vg$l(%JOEFa#eix-oga|A_yfAHRE0PtuH>V*$_L+0B#U(s_z&Cc_@ zmZi2jmH70UVDj(6)fa$F>k~k45BcJz3*DV!r;AMt8jb**B2vrjAiqCX_kBdr`qB1` z9RLkMm)$SSr5{r<=pR%Nk(`)#2DfNvH~s6{uM=8WSIwg3P(C7_8;}e2y^p9oO0ftP zPD5KPnJ=(PmYJxpvEbpTTU5m}VERVUcC+?rR1+BN*JpU92aSPxW1+A>CPbrWU&%ZkGTX-H;DplH>Dw)^vZB zX#%jfc_#tm^^Ag!0G!5M0kqi9tbzuJ6>tZd=C6EdRvpB$aq1{O+D*E1nOf05Ka0YV znpC_s*0Ia`FAR>-MuAihOQYfvIO(+{ zR6_oNg|rLYNhvI~jHR%b=cpu|^&TpgsIR|YA#Hq!6`+~e0eyd022o3dCcR?j^`fN&M9=qtVb%(rZ!|4ahU(KtqS1H0*a zWmO4G>WpkjygnbWMLb%-MZgCD_Uue&VgD#;rdS6M(}pXjNO6xt6X;~dJ0nUD-_I2pX@2=x@1DFpaGu^xF@p3LzlWm zetv#$t5lU8kG%3_l6x^@282Uz8k8I+ub{WRyBI*`yKq!G5k&W;C(6=kWUSd`o1+BNm_!s`Vgt{C*QgXr9#|-UnjpFDPCmFKr9qmvVTM zlG;pg>QyY!aLDCLXv z^b2LzDqlWu&@BC&zUBJWSN28=#paw~qSxENN-kg}nu7iWe(_gmXX#Nnps}Ym98P>Kpg1I#&!4mlmzOeQ0i^Vs;lQMFwYfgVdY; zJHPG;#P6X`BBi;9eATxrkIO8No92K)sX;9u`kSM*EqNwR4o(BS$4t$4fz(I^evr!G z&H@ex^8Ib#>%*kiza8oiVOZ+jKY^vIf&G8g!mB{QO1Ny=`_mEBVS~cL%vRk{k9C(; zzF#)`f6(FFTwG}b_6K99G@%Mmb|moEOdSoo&MC;&V!v=QtP*>Zn&~%VSCF6IprS0H z8l_V2O#iuYG|UTSfB3JWSn(3_0yU7Cl~s1kuC#yWri27vRlknm9BYY4E{Eu4S_eYu zGL^bz(A4s{q~bv`R-dZ7e}1~VHRv;$PvOFMq>VdGy~ z0yM?_b!N+EXjLG5yeIq=lQ!2*JrSD5+BUlkb=7Z6`&I^;Uhf2YbIT^Te35$8_VnDX zGCBj)FPz--qd1OnVKreY+x}0EytoNk@As9T08S>lYb-dzacOz1N*VZ}B&kjFDB&Bn zBA;G%Pqs)>8YD;R6?mH_*C!@NQTAbJ=_{8Rl))gv%zHRp!bnc9JlF7zUh>#X!Ro?z z!@_vGluy*92UkVy$8JGce}j$A<2&#&ZotbhtZp$dH~ulR1;bZnRwgOFS&mNQL1$NPjH0_Rh|4Yi)ej>U}PpLM{SZ*s{s%j`h9d*Z~N_ zd9F@oz6GJQ%&zOxJY7*@-frYyWf2U!va*7a>!wUNWE$17 z?%ThAv=Y0XzMn-T#$~cV1G@G2nDFrMo<##ABQt2BgL{D1L&T>4Iead_-#?n1TBL`1 zN2q|Ax`2;LywdiKLc_|#a>~$Ghps+{T$qqmP+8w?H@5;;i71RoL!2TaFE6hwCG|Ka z^!WyTZ%J{nM}t&xIB*N?O252gOG~A}@|8og35A7v_y9cq!@i?}<&%p^;3N2efPfgq zFhRLJ)gQViHH?gmrn>zMh_QTAl_qM2fp`_=hbs@0;^MXxoz_rQJuT3bw6GwkSXC_z zh>sh(%@LrHILe0jV*-N$Om*))g}WI7A|i=;+a(6iva_pzsGgaLDF~CSldYtsMH(F$ zX`Zs~(FB~DPHX|CmIi=Td`zYpT_7xcu-Sc{e%pc^S2^!3OT9=`2hq~P4LXQw6~hOf z!2LA-{CSdVYIznICV1*?2ZwBoNp+~e86JeEad`M+Zf-7SyB_DOmoNDRB~ofo%>+(8 z$W&0x_`c26af@-~RG>=!#gqUK2w()(Vd9LFPCo0o3IvK8NTqSE5}Eu$JKcj4xDp8; z8_RoQLYa?lm8|SHNKQ?}ck_Y(MHZyLa%Tu)yi4Izt6L@gL4Q_E#;K?faYkDu^XAD( zfdT!u6%>+ixGhG{0ZMamaA-lX@`YI1m1RN%xl2>Cy>_R+KR#w=#>T0@WK;JuTuVeH zEVh!hc)YTqfx$<>a?#Q3wvu`Gm;L=g)MZ;*drk+0CSRg-oxPu#|G4y9;qw@goGoFp zB=05!5K>b7z&BL%qj3}>H>;VYDc)*gS-GH4JI4&)*wKN3>k4{uRI$%tACtN?pfy12 zB#UoO#iqu@7-VK;7&}kosH>^P_V*tum~Id1nYCKajE?1)dmHcp9LY{-XCyD!3>4zK zog&XUj6pqfA{DuwV@4c|%=1^CT$?53S>ND3W@go5Fl9%$VPayEh!9Qc%yfD*U0hts zFL3FAB}_;5=i39P0y>jBxOznv?jN<_d+{(p)7ga2pRa|4gp7`j)wgQCYfrZ(*jA*a zq)fcIgEKTtcpodgw0gJ4PS9*3)8W_KnVF^wi`q!=u(PxCqarp&1_mxkNo+wu!RYwD ze4#^!4=28Rcf7x~Ez>O1e!T5d8N?VE@}Lc&s7P{&RT(I^uV1f%=4Qu^N0S1;zW`Ns z(aqf2`utLxUvO|dh|^4rjZZHTE32#39y~}J(f{`C8|bov4}D~Sn7hGt6#P&}2MLQQ zUNwdTUs^`y@uU|N$e^a-b2B$LzX6NI#}EiSfx*FH5`vI&f^rtyLEo&Vs%m`y{?%&R z$!sPjrbGgP-_6{{Mj3n%A2T=i5X3hj5`qE(v86eSbKs`Q*djfku5IUi0Aqu~#$u(l zs_HdLHOqN+bD;V&I6M|v1w=)UiZzJ+KNa7|jP_UfufTPH#P}$8ZODEB81dOEJ`w94 z5BKFtEXwAHI!rXq)=ILibquhr_3T`c+!)#z25IO1oaArM=#zlz0-gzRUKxo;dDGv5 zNkdhA{%9ahy1kPBJ8|+~coS}<+9v$1-yMR@#Epr_Ais|j4KJ7~O7?IQIpkQj)>#}o zn%kEn5S%2emV-ffKc((Ni4(pdz(|#z49M+)M}mzB z1pcZ;&*g0EamRr`jfbEkdg|&1$u-h#L95fYRverqIMQ`S4y2HyAWUgX(|?Bd_t#%| zOQZQMAw)Z#jy~y2z?A?|mb)^VWY<$ni)z)uSyoDg3g6Sa z_G|?X6TMa;&~hhwC#&P-l9Cc2yU-g(@7t}4#2t@HMBUuE|Jct6hpq(JZ#iWJg;#KX zJvz#`MOIARl3I6P7A^RZ@$|veFIB# z9`3W9BjOj_?i?MvhMwlAD&;V>3WNv^>ex^1nbMQ(MY6M}F3qkV_e1_-j6BdfR43a~ zw=w&k9cV44fpGD-blX+-mCsk$HxIk=CB#E*t8%5bt$nF&oz zLfU+4hWGLbQ&aO;HsMf0|IvchA=WgRZpRk z4Jro%Y?L>I4qr)GFH3E5PKJZ}Ox5b+Yl4haPONu3jQRY}cqO&0P?h*Iyw9N#{>unc zn~!`yN}Y8vX;ZG`vI&Q;Ln9m!jZC$qQbPaM35Onj)`2~sKSJ3a6jS>E%mIvuy5Dgd zs@GUqS>4!#IoUNLdM&(R1t2D4|6L_hSKkZ=qW{V7pfP#zRVux3>68Af04I*4IvI-# zvJogBgjk&d<&Gwbg0DSilG9%R$yu)*l6+vdipkH7K{5&xbKZHx;$Y6!tlpJK!8pB^vTCDVlX=SC?Ly1W0yJ&@BvsZE=s1 z&Oi=A-4kcfpiM>B4B(v}-l#8WxK|97-281+~ zQ+m!oO)V)XP4O=T4m|Z=H2lF$-j*sfL)odj44d=S%m#8&B~Yqtwpv5+EJq$8p~xb|G;6qk?RifRPtMt75KV6+_#;yFvA! zYNA5hEgqYLtgX3%3=N`*MU=SnJ1ENhP~Hf)c`6Vf`-0aYX@6=%R{UELiM~Pwk(w#k zES$_jN#EWo`$s4j`354M5nU&4K-&0)y6X|Sj9&c&pxKY**)>~U77X5`qrUHe_h?@E zi-LRx0*zXqAs{QgV^POM<%|cY!38B@gVZh?nkLXx8vB zrlu|@CnqI(&t83|nnP@_AQT4ikOSHOjRLo`vnv_vYdj1Ro8Js~#C5@F;26;Jc2iG9 zo}BbG`4g~sRZj1>-1*AzM01wSQUIYXR)YB)mw%z^7``SKujfcmkJ$Gu^hikBkP;6* zGU7vTs6g&oUzpv5OLeM-5#{0_hq7RBUrJo@eTc>0eN>YSQB9IREy=Rd!dqa_&7x_3 z-#}WiXrd(=nf)L!oy|B>FWH$f)|`L^TA$twA$SR*%kkjor+f8j3fH4J!w$_F=-NG26G3{L`iIny_0X@7T5 z?bz#s7(ojF^O+12S{QnC;7L>1eT#jPor8B!~nM$PY7$(`yw3TYZ<|e;pa?z~2&+KP}O zR_EapETZ-|@CYDd^nRB~ONuVqs{>vjEO$LNT7|Y_w7L$x$@sD99S0(kn73J2SUAsA zaN0p<^VzYe-xN+QvOb$T{NdF@q=Z3Z_&1HiA=l90siL9qKi&tMEu$?K$;rvN-7PH@ zwtedZ*^|DVttj^v;#ak+Mn1(o=n!6jbmwf%;qzH5#O+@}Oa5l~PUg-p=$~*vFV6j_ zs@f~u)zLwi2Ekx^)~6#5D0zeY7xpIS?pE5%z3KNspQWjO7vooE$pfb#pF$3^x`ndw zQxz9FDE$hySAp0HhH5yz1ox>E{W)*K1&xV1;9^*9I?HA6E|O8sCT(oY9N@AsT(s6p z)sXQyb{mV0g8NCxL&|&$>J{2VoZ=0(tu$oNH8S@q=7XMWgd?Waz`xYvf~bUmCvcy= zw$~rug?kiO%BY52<=O0VvhK=LA?z^qR@%1BTWR~2R~|ju!Xn|SITVEyDn*JVq`D4p zqYC+Ip>6_qYQ9a$1Gs2%Le3do=^a$$lNu;+MC z0AQM~EwKF|127lvJPz*NySH^lxG(MBMKu4rhDL0*+kkHxF1DE#9{-p?I$jYi)a9x| zBzi`50uw1OKZC$!DK$PmPY#2?Ks7))>TvDIT1(5&Fc!vdggcKF6>@UQPEI+XNNQ_u ze{A)}&~N|`*IJakeRnEVoaW+EgBvKo-|&kt8(&S;(I5a~hGXB@(NPnx`de2sKHdag zE`93ML(A$N>B5|M1i!H)B_{`VPtqg8>d?&hn=Y2G2pwgv0RBTIddJhPIVt~OL*AE# zhQZw?mqOLl)F4hS6Oz8LmNIADh~!jCd>cvPnVU@<8(_IiVDZ6*pGIpYbAJgM*G zb4XlpZK`qja?i5HZLNgHfJ1Pp#`KfW&(60<(RU(w{ixDS0x8KnJ^f!&k`yq8-QuELXzdN>x5vCB zAvwmTr4?^n*}S;)s4TsqVaUf2#3Zw?Q!7<9G#2r9>>V7;3=AZK$;jsYrO2MNs_a@7ZlVs*2YlzlD)xG@PzoD*d$ ztE(VxI?FXB`jC1p2@)+}R6GW~y+WdH#gTY zsrnxx6FE>P0hjUrR%Mc!Kl9S^^RFGTadGn6ttyxCg|iWp#+5;5{}z`Z|Di6y>iqww zF8Ozogzea|*Urg&q}TMbq`g&Fci<>v!ibu%Ze8`&a|L(AYVi5RrP&62E9U!sc-F*k z*BsUqtND?0@O0@8#+pB51BlxX`w~B0)B%{lScijqMud;v(F1VHy9QEh59a~d`c(IM zZuBZl_xeJ1=7Tq45L6EGEI3SdCD+x}^;~=sW|@ofPkY^K|8EEjBxMO03lX@m=YxbZ_Xhuk zMyG=m;dFb(QW(B>ps2~`rH0E3e5BawI|0V zG>Lsq!$zO=?Rq)F)P;708}E^A-uwn@2p{|bl`IWnvK7^`4E@_uG{uJB<{a{d}zUrhtW0|-eP}z4dA`NoqtRC3f?ZD>!0g`|9HIqHi z&!c`-f|b8Ol?lgBaQs*qn2PG#&s}!}Fp0hg97iAEx_oidj~_qaVBk3{0+%3Sn~3;I zKn4bif(NMu+l!w^&hts5PoZ{cb%;3c1}TpL;8Re-;Y}}h7@`z@_U=y3n!~%Uqg4yF zN`p+`+W4OQz1wGqj)=#V?&Ok4m(wrSG%yl?DqQvCjq_Aw?LX%~`Fs79hM$@2HvSwJpDEX~Zsp?0Z zFp!**J%?7_P||CIUIt&EZ|-;Mu)7vOm)=D)v6sW?M<-U;(F`XnjzodSr@Cw%!p-q!Q?Z0-c~1m@E}p~{T5mpouu2}sxjDY z7~&AGLRW|p%PvCADKFYZ0{7lS$I)vud$!S-dtcx4WzDeL;JP5!p3g>#w*h}|@ko7t znWnf|Gv>VY1%#BXW+=$D_p=ejnDzzyZt~q_8k$cGEqZdctRsPQHxKRTAi94C_ol&K z^Q7@eUjA{_cq*k=9FOO%!Jf;B@T|}w%>{qBtTn#*7520Td-@NWPXbAdS06htq&S{i zo_RTxGXBKC9UTWT(!B@H>`_FW1N?!5s?%G-rh}I&C)#&cgqtfLvaS`9rbCS(L^TFz zVw)5_MqFLiZAi0(6U%yn$*1=^K4$Rpyb7MThHimJ6!r6MwAd@RiwjoTbgY~9^Uh}KRm>~|T}?j~ z2218MVnN+^-3PU^zTZ{R8L#Ea$jrxj@{5UQ!VYck;6ol<`}+;EnO;Bd?!anI=YQ~h zlOLtHXX}JhpUT0#|C(UJkLAiiLit385)z$#u&amny5}SN(&p34P6*eYLm7N$vU*zo zdUsZHjNC!gqn1b41`@-JEOz2>4c+j}C7pZkF8w_y^v=?Acb^X-72pS}u?rJoW_cIb z!*Gl{2&ebR4l?dY%sPGRIT(5)8r^K5f4|GHe7H7<)M6KE-k9di#F}fX9XTJS=0!_H zWk35-UxpUb7c~*rP_xt+Vc$9VpeSAgf3R2cp&h8xd4n;E7hW#P%2#3c-vA@bde?11 z@fi6QYDgaCBdvQh#Dc5zrjG@xG?8M?_e9!x(ZYlapKhA*Yw@==#Bk#l11aWoPo&lB z!{|ntQ8()GPWp>4k6%8Ikcu4n&>hgXpryHN0>6{mwKL-{F~O%y=(m7rc=_@)>Q|$F z?XM6e@#mfI@&4e!Y4P_9)CCdvB+Z%-RKEOxTE`u@Uw}W{Bk~-3{vK)IHRU`RS9GrBOe-Tsfy4B%=m= z(pL|L>$DYXUp<5*E`0gx5qHfB)Bj+u>Q9;t76rUv~CNRiL&`VWU+R2-I!L& zSw85)eL5e7zvBQp8g~zQj;jv592yjJj*eKb88cr|x%ZBLUG>OmA2edAlel=XYO>%_ zX1*knb9um-BWL<_1QWWQdQA-5_kbf&a~KV6l68q~1wl{FYHz~RMXlRMrgm`e+1dp& zR4itu+MI~1Mw8s@>_OgWSJxA0Oc7H~_n?;|)u;oV)O@&S2+dELA!tBpsT@JQg`4Uv zl-0%6Yd1Lv`u<2SGvfLu)pskl>t8+-USzJ9ijfMeR#PJxWPt0YoJGyT_tx?I~AYzr#s%i=i&ELd8M&kuH%;)PVCE+*LUVMM=r5k#Zn_Zt)YjO zK5e>>4D&PiK|=C#&dMfPMN)u~wkY}tPA5T!OLHWLaZ41Z16ux?>t;qfbbKc#o5JH4 zs}40SCtEt&kyN>LkYY6I$<+%?`2PI~s9(9drRg zK7C>kHToIrrh90=I+6PL-G$PL2xI!)aEv^;7eTLI4_&k)^n6c)Z4VEUK$NY12C?sa zi+dfN59CYN!#oK$?S=jl#v$|mVi}+&D2j-@-&hz(heX4Ap}%L@X|e_RRPf^0Em7HY z#Y_SUifrl_Cs|aZ0BXpIOqE-YC_tts)rOe1Uc4khJ-gMlOoQc)~4H$f4ZTGVKuw7}inJs-#=;}a8NfsEx# zk4~IAMaRr6BkOhcu&HvSDV#--184FRr=<{^ac6!haY!Nbg0Yzosza^@{p@~}w5+W1 zFs1S?E|u^~RHA1uTE*_3xk8R_jmDWm^hTq1_C7| zYj{{2%?>y@dm389BG^sSe*U}&O-;(ltw|z*5v+!BKYvPtQo|GAfCo{s8MTYR`$4Jv zRsUCZlWytXzkhQ%tbM$HA4?^=KFcBf{P`PS3jUkpV>C1(X=+8$l+$DNSGXKEkc?oa zj#M>axWUiGsu)?ZSGfd~Y=%GmO`?@#*~NPcfv^u7rp%-NRXXTF@5hOOQq-m{JW|Xhmd4??}iqu*$!?K=#VpjNY^lmSRYV-qV{e z`ipbY6w(z(hVqj8&K@k>)~#-z+8f#rSnYF{|LAdBRFrEn*pJ3z`se4zTp@vRu{Tm5 zzJBZZ{{2tjJNYz?iLaAh3+F_~1KXAu>waC3YeT%b$?ExRHM|SHuLA9jS6k=qP=-Qs-m*-6>Uapfv4eWwVXN%9!XU z5F-nePnINuYV-8w5Yh$vn^81PqpZ-VBW*l)-W`weCkQb}j}!vU2u41Lu@5rzdF91) zL@`qpy{@hg>_j}YLx=~CjEtbS@++dErk?H2(G5(1<&b7JPzr$0%e^8mA0GvHGM+&+ zc7^<3^!@_jOjq{eav?N^p$j4qR&?gc^CUEotiQvj2z}mf&T7*AbJP@aKrX8(f67#c z^%hdQ<;3V~A6-n#V& z_)F_{YEX{`LLGJeM@i_OV$m}&h(QiRtE;Qq%k3@wiqKZ9#lece1bFjQL9eUi=5*7% z&@v(gRr63vk2h~pU>?zL?l-rY%KkN zGFlm{N8wO5i(vuL+L|#iNd-n7ccB?sD{yTQIaEW{Z9%qaY-Q&J-qk4>EcCtjw#T55 z^v<~HBXj9O>FiVEcy5VP4*LX}*4iG+57MT0JJ}NgHMuRkC{tUJASvbkz=m!81}jnQ zMEARf?zW=+o7*K~6$kL*_|IhWT(THO;vnuAhiFKqfOeA;lv&!*LX;xMZ$1V z?VH_GDMqBVYCZl$lqQjJxv$C2+XhJZt(z)2vQDe{+)yqw2~U!W$pQiyr{}T2U*ZIW zgo$7cxy~MsyDT`B(kgp?E-iI4Z7 zo5qlY+a?3n2CKu`i}U0>-8npSV)R!x#e-`pl6k4G7@m?Cgrko!4YM-u6x? zoj4xs&RO{73Y{X4Eu!f_OII6t6pq@SJ%%RYTikv9>t=n0neCI`;Kt57RuVCM72hWp zi$^bnEmA;x4l3Z1RDh4szPh*}c6BizW3OSZg+t`TYSc5nJiKFrG-n?aF_s2mId!(xjQQ#elbyyFZn?eFOz|hg%&8%2 zMugFP%EQCn@&QA}@N7k3znxvJx5>`VdmO30$=TZ{c}#&*i#a^HEJx&~nCt_jryN46 zro2KHt@~PV~#!farcJLLvH=Yx1;eU33^dg zla@`_1(C`C39Y+lO~AaSUtN&KM&~u~M4Fn#KfQWML*l%u;B09bBeq6~!@}V$x<2s= zOK~v65{{b-1(0rOxOkAuv9Ofid&jxrl>OYk_gFpBYm$^;Z{Y0adG%CbCSTl%%`CZ* zP&q!W>;4H%c|BtNuf*^cG?Goz{T}c_rReJrvpbBYp26-x4SPdluV#HiD{Yue zs#_oOC;hG12ZA3vNLU58r{!36U7Vh2@#w2^F@0z4la`RJ)%SVfaYW4FzY#eE+$@z` zNKc#aN4<3>*hnlA8fT7x*t+I*)uMy_emZ-Kn*+qSiy#w zJ7295v+WjqG)3bLa#!ebtK=0Q|eIzU1L7#95KTA_foA|Q~q z=Q&B$ns-u~6TX-67+sODDLn6+BQ=(b&3PA&KffY~CbHz{%BsEP;V(855Zv^!%G>jH zq(8bmNv_f!*ER;#-JH@hU;J~vsQl9~ww=U7LeVAE`dlxd`75fF!XZ<6O4}Iv=pZUn z@ZN4ba5Fhcj;64FX!3itDY~l3bJCR)y&pch+~=$D5T<+xrf(tPM~j`bC!Yh&(LbOm zFW#9m@L@~1qj7`ftwNif(&K@B&?wPMi0*56M!;u0e$FL-se`8aFsgVZY!m54-Q|KG zvc2e4m(Z)~PNT2$=!MN#B!sT8L*NHj;0LJnzziEW8P_1IE7?sKy3u?7F)0OR1HI_X z{+na|Na95kGZcdAR<*b%p4sh}onfc>Yfu�MY2Ha1VaM>F$N76-|S~7B`sLSiUXm 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 z z7YlKCS9>i`4>6E}UxM$@$bc3Pj(Vxp2cUxH0uDHAGz2HWX+pGUE#cghO+U-XB$)Zw za1Q^^?P+;C?v@@CQ1>A%b?ivP|cG`f-J=fDycyWlP zAz-k-?QafgecrdA1WtTh*^OIAUtQsd7~AVu*!Jz&S`@C3qhrCKKt5gvyPnf#?iwk( ziT2OfheGyVHPt}JYA}d#u7yCjzPWikt876Bz#y3EW1XpUh34rvaQ2-DM1RB_X4hc} zoyy1~1e9_MK*=q@kyEs)_#oFb04g3Js?~PcEOH0UYt6_6w5^mwMPjbMBnWbzSBLwX zET+Aza((pXF(|8b&}G*YrF%mCUp=n!iJ;(eJ#~!5+LTO|ddVZGO-}XXQG*Tp-q%;w zJ%7(>%L1O_w04(^rvApeaK1llKx8^i{)~Gy4-lW;yn6=+i+%&Dj1QECb)F#ri9Zn* z?hE0!7{-8t$d}!(DpAlx9u1o8z&+5T-vyKU!P8R*NTR?q^MsQ`zNPYUw-rGTz|l1^ ze5S#>aNH?$;dslL9sn)rX$;>dhIzJLLFbSz{uG((p*s}9LP1{zqMO;A~S9t@1hD?k&x z&!~n$mjGDhWY`lJp8d5pU>0y7P5^(MBjXANr}h(iC(;!1B(p?7!lATEfA{1Upa{mp z%CIbf6;iS}=s4dH@e+OuaHH!`UT#4_pt#E7(ozz=+4j`eF)9^U;YO_zf;H!ZtlovUdO9Dm7uTsG3^j6nG>)x zuk$(t!>3q4ra3BvP?h|SVR6o*x&bx9w_#yn%cWISRdS{PadmH5XkaVPQSe1UbQ!ri z*~$U{Iu9>z36PklyK`87Wp}!;{ zIXMqlet<0w6i>Ng$9>&Omk?pQ2v`*`-2z6q)H9k#~sx55#`hc8FIpMkJnx!jIfqtxm%(2r{! zaf~`M&U}STaeL_Spe|87%r$)|IypIc75*6pA?AIkv>B`78|-vKRqN{xjw9H~J>ZvJ z=dyYa#j5>?onaF#z-5ppz$3E<(k}D~oU7X3AdQZWMyW3;jo-c<`!c9}F(XX>$UOBG z`GMhEh20Rjp!96_+kb7#tDKMFuQh8SAyb>11sd}(v;r~neZ(Cb8(ZqPY|Vi>^P{0Q z5QgB}nYuknx(%W;OJGz;v!x>0eULhGM{j7_Am%umzr4D7o0snT5*!21`&WmTet)ak$WGaRR)`Ni0D(WUrFT2dxtGH=;*eO{ z!x7cnFwv%A*D)5Bmby?ze;R(@1HwLOKo33c;I5S zK$X{L9ONiY1D5p}cDdDjZ%B<75$MnOT;3cAuY|ba9jvh{pehL_hL4YLZ2=jGgg`X7 zct3Dsyks(Z6b2?4NX5=olzmJcKI3X^;Ub ztB<=aIFFzA?+(W*(CT0O>-$A&((+kO|FKt3682~w{&jn|#QweFeHiZp9Of|T2RP*a zKmVaX^M+$FSYYC%o{Nz3L=Pk#C zl!*CAmF(OF{=W6yFe54)azvoObHVk!h$u9C1%!u-N=izm_P5sz43OdDPm!zJMX9O zLZ|=%uZX>jH##tR!8a}j%woYnG-ND*j`96;wS;nn27Tx6D(JY6$&qv!dCBW}qCr-g z=o#EU0nw#j5@!XUh^4`9sXf$CS6^CR*MmkNa18{m&~gSRme)b5u(YzG18zw^U2*9P zTC0Kj2`oB%D9`i*vj+7e0AmpLDr!O>C$2U$z`(~|ynGp{h9+3=E;u4ZrQ{VAXiMFo zq4HsQ=3Y`e-f^A^5 zb?55gNkp(d12S>q;9EaGe5ldgge?z@jW5uc1b$<>E1Lp}DdV8hg+Wa!)X1QFL}&8= zPQ;G3pCD$`EEj=7J30C!{>+X4P7fS5}Cp- zI0z1oNnfE4DDp&uq!O6D@6c>{9ExtIilK#R3v8yakn7C*ZCPH8AyJ3paomLZA`rqAQ>C&KD@OLnDdN z=5K0qwe9WQ-O<_EMsQaT95?8pq&*C$KYg#OYlHX*T6dp0@UB4CaRmeFJ|~AEb%hho zj&hORY>^>WicpyNlXz!(A6vDiFIr7wd z%$zAZ*YlEe)cf}$9iJU9z848WrN_a6F9xdtMYZEthMy~()qabe{VHr12vpuACsP9| zrC#aOv%m|js|*m}+`4z~qU#WHNCrj$?JotiL0gHPn))4h&ryULSpla+{=C8*W5-%6X-c*MiA_@PA}t;-qr69-rM(>~iV+>vPK4 z-&(k9?ANA#!Op1N;=OmzA4rEl4S9^3WoU*9<(5?+fXwGQze^P4AF!e>{4BLLhL{rN zg*sOc?EG%scj~_#*dyUtD71D1m4AlG}ioZfZf&UeNs=3R@!I4l>Q$tw) zIx>X zqdovlHX}d*c@F$@H2j05MhfiRVApEbF%`8i~ z=9V5tL_qZa_YSwZXjoYZpzn*r$=MkV2}`V|F9X<(*@MnSJL8 z&9_h~lg!qvc+r(b26-I3e-JqIo`N9T2x}RKwW)u=UMYXk#sQO;lqAWW1{%YKc6N5q zZ*&rxCrV&}lmJ2VMMoMTygWze<18sK

PNJD?8)z&nN36Kw4<<9_sooqYUyov6z9 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�m)EmcO~D5U~&>y-V3 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 z zwZ6(HZi(Io-1aSH`y1uBG@_=4R~0VjB6XEzg}CGL`Eiy~@-{}sudaU2y!0^%zfjwo zkD;D4d{eX-CWCk#Ie>Wad6eoulHzpuM1MO}TEH;iZGQC@H)@10pAw?;26G>CNN=&Z0R#d<#p!ITmhOQP(umbsG85!*_HGXvI<@agasA$8mQuPj<#_OW@0-8tVN zMHgAtOAFnL1w$qKXYNN*>tTdZ#FfUE!O zYrX!FuEA9u_e)E<{J&>g>&+sju^URe5F0fGI`ek1yy)2T*}%dBg@Bx&U)i219b z^_kgz{|~f17f{jS-HIF{?)0~pZm?NGFCW*iY@A9F*+F;x^|xUe9?GNRE?gmZvN&Eh z#l@Zayl4=)S0Yd0E#VW0gTrPx^D_20mRnZmhRvf&e8@+Pqa8B0(S zAiUxQc?=ZYKYeq3Tz3t9I~ciK*k1t9>&eb|MPN>+3v1~(x6!==n$l@TA5+lfGK>{8 z0e^nOVwXbrmhg(~JP7Z4E&sqkFU+P5&()`N=&KMD`!)Zyq~+=EQXn)xt>Z;cPWQ?7 z4IdOq%Qa1lLE54Z4yxfwz3vKPPG;q=0jLO=&1&GqS-^=+>~;Ys&Q8(Y7;O={LgLm z&0p-Y{7xtaC}+z>1wg7QFjNL;m^LbHc6YS6KO(FjNFDgah5vX_b3vq^m*a>p&a~#@ z423Z>n`J9oS2pVb%kzMchSb%~Zsu%870f!Bt5I6Pujb*^pB6K%m6)y0Kg#?*sjEBe zeEzZH?MofpGfz&mkm;i~F_c2gqcPD16!@GDdjuWbjh~bkdPwA6DAr-DY|kR=j4{gI zQ3bI_1&cF$R44qHXk%qLtLs7bE!9M1j)}C!7L!uMAx2nRG@Z=)^l#QguHZ{nUT)2x z{+hQg#`^8&xRNDPE3_ZY634X$jb30p!UL4oqXqG-CA=)s7rIO?HueaXN$sNxUR4YR zi#=X$ntfCgc}_^C&teOTk=rnJkT=*2!W$HoZB+0_uWtKH>JcAiV`xF?@osKSb7=;R z&sXmnT1h_Y!1-sLp@feIcce|r_6i0~Q{t?ey(b9SruP>ZZC6so!D6qWaAAh@KOK5G z3>-Q-%gz&}GtGL*!o&yyMnp_I@OkfytWbUP3Nm)Ie)?k&!CNoWlo(1Ox*!<+Ddy{s z(vzczUOB29XLs6fzg9I=Q!lL|>;TSJVe=akSj=M`%2DD-Y6BrwsQr)2lxlaX%t+v; zt(`=g)+UnM`zNRA2f2kHVgZ{zBvmnfRk3m`e6l3f&0ir|R%(nAFEFgZ|Lzzk#39NX z#P5aY@disl7_EFYJ}V}rexh<3`VnV*j?>W{zv0BJ<`Tfm@+?Me%xc?b_68qLIDbj8 zMNX_;Eew117^Ne!-}vFnZD!xNiQKFp7v^JBv+@?>@=N)Ir359tv1ctSM=c#LSo|vy zgh}&U%9^OJjFxKRqns0==EknBAl&u~5yaIC5Bl4TBsud*y?VLd^wwXukWbbhRa*=Y zuJjZ9JuM86>%R}pud*>(AkmHS9X(D>H$E$2GV4J%M)D2Q*7I56Mw#p9q!sJl1Yd0^ z>~k}ot&qAJ`6B71-wO$1z=~47iN!>vMkF!m1o8Jw%SZoLUH7kzmm$KK*1=MTZK-!O zIZ@$Xho>Sl>eVBRjumM&wO_zQ7)FgU^J=EpZTH<-D^l*s@JW2T3@de}c`~L#R z2W2dQKP%H=WIrqEZfykOcd&hdIK%&klb!sWEYSDyFVs1H!gGZ|N#*46UuRpiY^4Z>ao9-8Bi7VDv38VC<*3|J<x?cknf flwp3H5x>KRbf$dye&PER`WqM}t(zq`Zaw^8jH%!y delta 81590 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ⅅ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 OMqWl)I$O%n=f41R%`KP! delta 28719 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 diff --git a/frontend/src/lib/api.ts b/frontend/src/lib/api.ts index d1de3a313acb2..ad84040f92c31 100644 --- a/frontend/src/lib/api.ts +++ b/frontend/src/lib/api.ts @@ -65,7 +65,7 @@ import { EVENT_PROPERTY_DEFINITIONS_PER_PAGE } from 'scenes/data-management/prop import { ActivityLogItem, ActivityScope } from 'lib/components/ActivityLog/humanizeActivity' import { ActivityLogProps } from 'lib/components/ActivityLog/ActivityLog' import { SavedSessionRecordingPlaylistsResult } from 'scenes/session-recordings/saved-playlists/savedSessionRecordingPlaylistsLogic' -import { QuerySchema } from '~/queries/schema' +import { QuerySchema, QueryStatus } from '~/queries/schema' import { decompressSync, strFromU8 } from 'fflate' import { getCurrentExporterData } from '~/exporter/exporterViewLogic' import { encodeParams } from 'kea-router' @@ -542,6 +542,10 @@ class ApiRequest { return this.projectsDetail(teamId).addPathComponent('query') } + public queryStatus(queryId: string, teamId?: TeamType['id']): ApiRequest { + return this.query(teamId).addPathComponent(queryId) + } + // Notebooks public notebooks(teamId?: TeamType['id']): ApiRequest { return this.projectsDetail(teamId).addPathComponent('notebooks') @@ -1722,6 +1726,12 @@ const api = { }, }, + queryStatus: { + async get(queryId: string): Promise { + return await new ApiRequest().queryStatus(queryId).get() + }, + }, + queryURL: (): string => { return new ApiRequest().query().assembleFullUrl(true) }, @@ -1730,7 +1740,8 @@ const api = { query: T, options?: ApiMethodOptions, queryId?: string, - refresh?: boolean + refresh?: boolean, + async?: boolean ): Promise< T extends { [response: string]: any } ? T['response'] extends infer P | undefined @@ -1740,7 +1751,7 @@ const api = { > { return await new ApiRequest() .query() - .create({ ...options, data: { query, client_query_id: queryId, refresh: refresh } }) + .create({ ...options, data: { query, client_query_id: queryId, refresh: refresh, async } }) }, /** Fetch data from specified URL. The result already is JSON-parsed. */ diff --git a/frontend/src/lib/constants.tsx b/frontend/src/lib/constants.tsx index 63ef80121bccc..f8b3e96456bbc 100644 --- a/frontend/src/lib/constants.tsx +++ b/frontend/src/lib/constants.tsx @@ -136,6 +136,7 @@ export const FEATURE_FLAGS = { ROLE_BASED_ACCESS: 'role-based-access', // owner: #team-experiments, @liyiy QUERY_RUNNING_TIME: 'query_running_time', // owner: @mariusandra QUERY_TIMINGS: 'query-timings', // owner: @mariusandra + QUERY_ASYNC: 'query-async', // owner: @webjunkie POSTHOG_3000: 'posthog-3000', // owner: @Twixes POSTHOG_3000_NAV: 'posthog-3000-nav', // owner: @Twixes ENABLE_PROMPTS: 'enable-prompts', // owner: @lharries diff --git a/frontend/src/queries/nodes/DataNode/dataNodeLogic.ts b/frontend/src/queries/nodes/DataNode/dataNodeLogic.ts index a83d0398a49d4..94c2651343b31 100644 --- a/frontend/src/queries/nodes/DataNode/dataNodeLogic.ts +++ b/frontend/src/queries/nodes/DataNode/dataNodeLogic.ts @@ -477,7 +477,7 @@ export const dataNodeLogic = kea([ abortQuery: async ({ queryId }) => { try { const { currentTeamId } = values - await api.create(`api/projects/${currentTeamId}/insights/cancel`, { client_query_id: queryId }) + await api.delete(`api/projects/${currentTeamId}/query/${queryId}/`) } catch (e) { console.warn('Failed cancelling query', e) } diff --git a/frontend/src/queries/query.ts b/frontend/src/queries/query.ts index df71c0b1cef4b..01c218a290e6c 100644 --- a/frontend/src/queries/query.ts +++ b/frontend/src/queries/query.ts @@ -26,13 +26,16 @@ import { isStickinessFilter, isTrendsFilter, } from 'scenes/insights/sharedUtils' -import { flattenObject, toParams } from 'lib/utils' +import { flattenObject, delay, toParams } from 'lib/utils' import { queryNodeToFilter } from './nodes/InsightQuery/utils/queryNodeToFilter' import { now } from 'lib/dayjs' import { currentSessionId } from 'lib/internalMetrics' import { featureFlagLogic } from 'lib/logic/featureFlagLogic' import { FEATURE_FLAGS } from 'lib/constants' +const QUERY_ASYNC_MAX_INTERVAL_SECONDS = 10 +const QUERY_ASYNC_TOTAL_POLL_SECONDS = 300 + //get export context for a given query export function queryExportContext( query: N, @@ -91,6 +94,43 @@ export function queryExportContext( throw new Error(`Unsupported query: ${query.kind}`) } +async function executeQuery( + queryNode: N, + methodOptions?: ApiMethodOptions, + refresh?: boolean, + queryId?: string +): Promise> { + const queryAsyncEnabled = Boolean(featureFlagLogic.findMounted()?.values.featureFlags?.[FEATURE_FLAGS.QUERY_ASYNC]) + const excludedKinds = ['HogQLMetadata'] + const queryAsync = queryAsyncEnabled && !excludedKinds.includes(queryNode.kind) + const response = await api.query(queryNode, methodOptions, queryId, refresh, queryAsync) + + if (!queryAsync || !response.query_async) { + return response + } + + const pollStart = performance.now() + let currentDelay = 300 // start low, because all queries will take at minimum this + + while (performance.now() - pollStart < QUERY_ASYNC_TOTAL_POLL_SECONDS * 1000) { + await delay(currentDelay) + currentDelay = Math.min(currentDelay * 2, QUERY_ASYNC_MAX_INTERVAL_SECONDS * 1000) + + if (methodOptions?.signal?.aborted) { + const customAbortError = new Error('Query aborted') + customAbortError.name = 'AbortError' + throw customAbortError + } + + const statusResponse = await api.queryStatus.get(response.id) + + if (statusResponse.complete || statusResponse.error) { + return statusResponse.results + } + } + throw new Error('Query timed out') +} + // Return data for a given query export async function query( queryNode: N, @@ -216,7 +256,7 @@ export async function query( response = await fetchLegacyInsights() } } else { - response = await api.query(queryNode, methodOptions, queryId, refresh) + response = await executeQuery(queryNode, methodOptions, refresh, queryId) if (isHogQLQuery(queryNode) && response && typeof response === 'object') { logParams.clickhouse_sql = (response as HogQLQueryResponse)?.clickhouse } diff --git a/frontend/src/queries/schema.json b/frontend/src/queries/schema.json index 019230809f749..d7b3b2ca0da1d 100644 --- a/frontend/src/queries/schema.json +++ b/frontend/src/queries/schema.json @@ -2413,6 +2413,51 @@ } ] }, + "QueryStatus": { + "additionalProperties": false, + "properties": { + "complete": { + "default": false, + "type": "boolean" + }, + "end_time": { + "format": "date-time", + "type": "string" + }, + "error": { + "default": false, + "type": "boolean" + }, + "error_message": { + "default": "", + "type": "string" + }, + "expiration_time": { + "format": "date-time", + "type": "string" + }, + "id": { + "type": "string" + }, + "query_async": { + "default": true, + "type": "boolean" + }, + "results": {}, + "start_time": { + "format": "date-time", + "type": "string" + }, + "task_id": { + "type": "string" + }, + "team_id": { + "type": "integer" + } + }, + "required": ["id", "query_async", "team_id", "error", "complete", "error_message"], + "type": "object" + }, "QueryTiming": { "additionalProperties": false, "properties": { diff --git a/frontend/src/queries/schema.ts b/frontend/src/queries/schema.ts index b0ad656cea099..5e0f19452d438 100644 --- a/frontend/src/queries/schema.ts +++ b/frontend/src/queries/schema.ts @@ -542,6 +542,28 @@ export interface QueryResponse { next_allowed_client_refresh?: string } +export type QueryStatus = { + id: string + /** @default true */ + query_async: boolean + /** @asType integer */ + team_id: number + /** @default false */ + error: boolean + /** @default false */ + complete: boolean + /** @default "" */ + error_message: string + results?: any + /** @format date-time */ + start_time?: string + /** @format date-time */ + end_time?: string + /** @format date-time */ + expiration_time?: string + task_id?: string +} + export interface LifecycleQueryResponse extends QueryResponse { results: Record[] } diff --git a/package.json b/package.json index c99c80f987667..f89d7b151eb93 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "build:esbuild": "node frontend/build.mjs", "schema:build": "pnpm run schema:build:json && pnpm run schema:build:python", "schema:build:json": "ts-json-schema-generator -f tsconfig.json --path 'frontend/src/queries/schema.ts' --no-type-check > frontend/src/queries/schema.json && prettier --write frontend/src/queries/schema.json", - "schema:build:python": "datamodel-codegen --class-name='SchemaRoot' --collapse-root-models --disable-timestamp --use-one-literal-as-default --use-default-kwarg --use-subclass-enum --input frontend/src/queries/schema.json --input-file-type jsonschema --output posthog/schema.py --output-model-type pydantic_v2.BaseModel && ruff format posthog/schema.py", + "schema:build:python": "datamodel-codegen --class-name='SchemaRoot' --collapse-root-models --disable-timestamp --use-one-literal-as-default --use-default --use-default-kwarg --use-subclass-enum --input frontend/src/queries/schema.json --input-file-type jsonschema --output posthog/schema.py --output-model-type pydantic_v2.BaseModel && ruff format posthog/schema.py", "grammar:build": "npm run grammar:build:python && npm run grammar:build:cpp", "grammar:build:python": "cd posthog/hogql/grammar && antlr -Dlanguage=Python3 HogQLLexer.g4 && antlr -visitor -no-listener -Dlanguage=Python3 HogQLParser.g4", "grammar:build:cpp": "cd posthog/hogql/grammar && antlr -o ../../../hogql_parser -Dlanguage=Cpp HogQLLexer.g4 && antlr -o ../../../hogql_parser -visitor -no-listener -Dlanguage=Cpp HogQLParser.g4", diff --git a/posthog/api/insight.py b/posthog/api/insight.py index a31f2dd9dbe05..20ec5e93d0619 100644 --- a/posthog/api/insight.py +++ b/posthog/api/insight.py @@ -21,7 +21,6 @@ from rest_framework.settings import api_settings from rest_framework_csv import renderers as csvrenderers from sentry_sdk import capture_exception -from statshog.defaults.django import statsd from posthog import schema from posthog.api.documentation import extend_schema @@ -32,6 +31,7 @@ TrendResultsSerializer, TrendSerializer, ) +from posthog.clickhouse.cancel import cancel_query_on_cluster from posthog.api.routing import StructuredViewSetMixin from posthog.api.shared import UserBasicSerializer from posthog.api.tagged_item import TaggedItemSerializerMixin, TaggedItemViewSetMixin @@ -43,7 +43,6 @@ synchronously_update_cache, ) from posthog.caching.insights_api import should_refresh_insight -from posthog.client import sync_execute from posthog.constants import ( BREAKDOWN_VALUES_LIMIT, INSIGHT, @@ -95,7 +94,6 @@ ClickHouseSustainedRateThrottle, ) from posthog.settings import CAPTURE_TIME_TO_SEE_DATA, SITE_URL -from posthog.settings.data_stores import CLICKHOUSE_CLUSTER from prometheus_client import Counter from posthog.user_permissions import UserPermissionsSerializerMixin from posthog.utils import ( @@ -1034,11 +1032,7 @@ def activity(self, request: request.Request, **kwargs): def cancel(self, request: request.Request, **kwargs): if "client_query_id" not in request.data: raise serializers.ValidationError({"client_query_id": "Field is required."}) - sync_execute( - f"KILL QUERY ON CLUSTER '{CLICKHOUSE_CLUSTER}' WHERE query_id LIKE %(client_query_id)s", - {"client_query_id": f"{self.team.pk}_{request.data['client_query_id']}%"}, - ) - statsd.incr("clickhouse.query.cancellation_requested", tags={"team_id": self.team.pk}) + cancel_query_on_cluster(team_id=self.team.pk, client_query_id=request.data["client_query_id"]) return Response(status=status.HTTP_201_CREATED) @action(methods=["POST"], detail=False) diff --git a/posthog/api/query.py b/posthog/api/query.py index 224aedce40464..021139911cb96 100644 --- a/posthog/api/query.py +++ b/posthog/api/query.py @@ -1,11 +1,11 @@ import json import re -from typing import Dict, Optional, cast, Any, List +import uuid +from typing import Dict -from django.http import HttpResponse, JsonResponse +from django.http import JsonResponse from drf_spectacular.types import OpenApiTypes from drf_spectacular.utils import OpenApiParameter, OpenApiResponse -from pydantic import BaseModel from rest_framework import viewsets from rest_framework.decorators import action from rest_framework.exceptions import ParseError, ValidationError, NotAuthenticated @@ -17,46 +17,31 @@ from posthog import schema from posthog.api.documentation import extend_schema +from posthog.api.services.query import process_query from posthog.api.routing import StructuredViewSetMixin +from posthog.clickhouse.client.execute_async import ( + cancel_query, + enqueue_process_query_task, + get_query_status, +) from posthog.clickhouse.query_tagging import tag_queries from posthog.errors import ExposedCHQueryError from posthog.hogql.ai import PromptUnclear, write_sql_from_prompt -from posthog.hogql.database.database import create_hogql_database, serialize_database from posthog.hogql.errors import HogQLException -from posthog.hogql.metadata import get_hogql_metadata -from posthog.hogql.modifiers import create_default_modifiers_for_team -from posthog.hogql_queries.query_runner import get_query_runner -from posthog.models import Team from posthog.models.user import User from posthog.permissions import ( ProjectMembershipNecessaryPermissions, TeamMemberAccessPermission, ) -from posthog.queries.time_to_see_data.serializers import ( - SessionEventsQuerySerializer, - SessionsQuerySerializer, -) -from posthog.queries.time_to_see_data.sessions import get_session_events, get_sessions from posthog.rate_limit import ( AIBurstRateThrottle, AISustainedRateThrottle, TeamRateThrottle, ) -from posthog.schema import HogQLMetadata +from posthog.schema import QueryStatus from posthog.utils import refresh_requested_by_client -QUERY_WITH_RUNNER = [ - "LifecycleQuery", - "TrendsQuery", - "WebOverviewQuery", - "WebTopSourcesQuery", - "WebTopClicksQuery", - "WebTopPagesQuery", - "WebStatsTableQuery", -] -QUERY_WITH_RUNNER_NO_CACHE = ["EventsQuery", "PersonsQuery", "HogQLQuery", "SessionsTimelineQuery"] - class QueryThrottle(TeamRateThrottle): scope = "query" @@ -116,40 +101,73 @@ def get_throttles(self): OpenApiParameter( "client_query_id", OpenApiTypes.STR, - description="Client provided query ID. Can be used to cancel queries.", + description="Client provided query ID. Can be used to retrieve the status or cancel the query.", + ), + OpenApiParameter( + "async", + OpenApiTypes.BOOL, + description=( + "(Experimental) " + "Whether to run the query asynchronously. Defaults to False." + " If True, the `id` of the query can be used to check the status and to cancel it." + ), ), ], responses={ 200: OpenApiResponse(description="Query results"), }, ) - def list(self, request: Request, **kw) -> HttpResponse: - self._tag_client_query_id(request.GET.get("client_query_id")) - query_json = QuerySchemaParser.validate_query(self._query_json_from_request(request)) - # allow lists as well as dicts in response with safe=False - try: - return JsonResponse(process_query(self.team, query_json, request=request), safe=False) - except HogQLException as e: - raise ValidationError(str(e)) - except ExposedCHQueryError as e: - raise ValidationError(str(e), e.code_name) - - def post(self, request, *args, **kwargs): + def create(self, request, *args, **kwargs) -> JsonResponse: request_json = request.data query_json = request_json.get("query") - self._tag_client_query_id(request_json.get("client_query_id")) - # allow lists as well as dicts in response with safe=False + query_async = request_json.get("async", False) + refresh_requested = refresh_requested_by_client(request) + + client_query_id = request_json.get("client_query_id") or uuid.uuid4().hex + self._tag_client_query_id(client_query_id) + + if query_async: + query_id = enqueue_process_query_task( + team_id=self.team.pk, + query_json=query_json, + query_id=client_query_id, + refresh_requested=refresh_requested, + ) + return JsonResponse(QueryStatus(id=query_id, team_id=self.team.pk).model_dump(), safe=False) + try: - return JsonResponse(process_query(self.team, query_json, request=request), safe=False) - except HogQLException as e: - raise ValidationError(str(e)) - except ExposedCHQueryError as e: - raise ValidationError(str(e), e.code_name) + result = process_query(self.team, query_json, refresh_requested=refresh_requested) + return JsonResponse(result, safe=False) + except (HogQLException, ExposedCHQueryError) as e: + raise ValidationError(str(e), getattr(e, "code_name", None)) except Exception as e: self.handle_column_ch_error(e) capture_exception(e) raise e + @extend_schema( + description="(Experimental)", + responses={ + 200: OpenApiResponse(description="Query status"), + }, + ) + @extend_schema( + description="(Experimental)", + responses={ + 200: OpenApiResponse(description="Query status"), + }, + ) + def retrieve(self, request: Request, pk=None, *args, **kwargs) -> JsonResponse: + status = get_query_status(team_id=self.team.pk, query_id=pk) + return JsonResponse(status.__dict__, safe=False) + + @extend_schema( + description="(Experimental)", + ) + def destroy(self, request, pk=None, *args, **kwargs): + cancel_query(self.team.pk, pk) + return Response(status=204) + @action(methods=["GET"], detail=False) def draft_sql(self, request: Request, *args, **kwargs) -> Response: if not isinstance(request.user, User): @@ -177,8 +195,10 @@ def handle_column_ch_error(self, error): return def _tag_client_query_id(self, query_id: str | None): - if query_id is not None: - tag_queries(client_query_id=query_id) + if query_id is None: + return + + tag_queries(client_query_id=query_id) def _query_json_from_request(self, request): if request.method == "POST": @@ -205,73 +225,3 @@ def parsing_error(ex): except (json.JSONDecodeError, UnicodeDecodeError) as error_main: raise ValidationError("Invalid JSON: %s" % (str(error_main))) return query - - -def _unwrap_pydantic(response: Any) -> Dict | List: - if isinstance(response, list): - return [_unwrap_pydantic(item) for item in response] - - elif isinstance(response, BaseModel): - resp1: Dict[str, Any] = {} - for key in response.__fields__.keys(): - resp1[key] = _unwrap_pydantic(getattr(response, key)) - return resp1 - - elif isinstance(response, dict): - resp2: Dict[str, Any] = {} - for key in response.keys(): - resp2[key] = _unwrap_pydantic(response.get(key)) - return resp2 - - return response - - -def _unwrap_pydantic_dict(response: Any) -> Dict: - return cast(dict, _unwrap_pydantic(response)) - - -def process_query( - team: Team, - query_json: Dict, - in_export_context: Optional[bool] = False, - request: Optional[Request] = None, -) -> Dict: - # query_json has been parsed by QuerySchemaParser - # it _should_ be impossible to end up in here with a "bad" query - query_kind = query_json.get("kind") - tag_queries(query=query_json) - - if query_kind in QUERY_WITH_RUNNER: - refresh_requested = refresh_requested_by_client(request) if request else False - query_runner = get_query_runner(query_json, team, in_export_context=in_export_context) - return _unwrap_pydantic_dict(query_runner.run(refresh_requested=refresh_requested)) - elif query_kind in QUERY_WITH_RUNNER_NO_CACHE: - query_runner = get_query_runner(query_json, team, in_export_context=in_export_context) - return _unwrap_pydantic_dict(query_runner.calculate()) - elif query_kind == "HogQLMetadata": - metadata_query = HogQLMetadata.model_validate(query_json) - metadata_response = get_hogql_metadata(query=metadata_query, team=team) - return _unwrap_pydantic_dict(metadata_response) - elif query_kind == "DatabaseSchemaQuery": - database = create_hogql_database(team.pk, modifiers=create_default_modifiers_for_team(team)) - return serialize_database(database) - elif query_kind == "TimeToSeeDataSessionsQuery": - sessions_query_serializer = SessionsQuerySerializer(data=query_json) - sessions_query_serializer.is_valid(raise_exception=True) - return {"results": get_sessions(sessions_query_serializer).data} - elif query_kind == "TimeToSeeDataQuery": - serializer = SessionEventsQuerySerializer( - data={ - "team_id": team.pk, - "session_start": query_json["sessionStart"], - "session_end": query_json["sessionEnd"], - "session_id": query_json["sessionId"], - } - ) - serializer.is_valid(raise_exception=True) - return get_session_events(serializer) or {} - else: - if query_json.get("source"): - return process_query(team, query_json["source"]) - - raise ValidationError(f"Unsupported query kind: {query_kind}") diff --git a/posthog/api/services/__init__.py b/posthog/api/services/__init__.py new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/posthog/api/services/query.py b/posthog/api/services/query.py new file mode 100644 index 0000000000000..1ef831bde1b82 --- /dev/null +++ b/posthog/api/services/query.py @@ -0,0 +1,97 @@ +import structlog +from typing import Any, Dict, List, Optional, cast + +from pydantic import BaseModel +from rest_framework.exceptions import ValidationError + +from posthog.clickhouse.query_tagging import tag_queries +from posthog.hogql.database.database import create_hogql_database, serialize_database +from posthog.hogql.metadata import get_hogql_metadata +from posthog.hogql.modifiers import create_default_modifiers_for_team +from posthog.hogql_queries.query_runner import get_query_runner +from posthog.models import Team +from posthog.queries.time_to_see_data.serializers import SessionEventsQuerySerializer, SessionsQuerySerializer +from posthog.queries.time_to_see_data.sessions import get_session_events, get_sessions +from posthog.schema import HogQLMetadata + +logger = structlog.get_logger(__name__) + +QUERY_WITH_RUNNER = [ + "LifecycleQuery", + "TrendsQuery", + "WebOverviewQuery", + "WebTopSourcesQuery", + "WebTopClicksQuery", + "WebTopPagesQuery", + "WebStatsTableQuery", +] +QUERY_WITH_RUNNER_NO_CACHE = ["EventsQuery", "PersonsQuery", "HogQLQuery", "SessionsTimelineQuery"] + + +def _unwrap_pydantic(response: Any) -> Dict | List: + if isinstance(response, list): + return [_unwrap_pydantic(item) for item in response] + + elif isinstance(response, BaseModel): + resp1: Dict[str, Any] = {} + for key in response.__fields__.keys(): + resp1[key] = _unwrap_pydantic(getattr(response, key)) + return resp1 + + elif isinstance(response, dict): + resp2: Dict[str, Any] = {} + for key in response.keys(): + resp2[key] = _unwrap_pydantic(response.get(key)) + return resp2 + + return response + + +def _unwrap_pydantic_dict(response: Any) -> Dict: + return cast(dict, _unwrap_pydantic(response)) + + +def process_query( + team: Team, + query_json: Dict, + in_export_context: Optional[bool] = False, + refresh_requested: Optional[bool] = False, +) -> Dict: + # query_json has been parsed by QuerySchemaParser + # it _should_ be impossible to end up in here with a "bad" query + query_kind = query_json.get("kind") + tag_queries(query=query_json) + + if query_kind in QUERY_WITH_RUNNER: + query_runner = get_query_runner(query_json, team, in_export_context=in_export_context) + return _unwrap_pydantic_dict(query_runner.run(refresh_requested=refresh_requested)) + elif query_kind in QUERY_WITH_RUNNER_NO_CACHE: + query_runner = get_query_runner(query_json, team, in_export_context=in_export_context) + return _unwrap_pydantic_dict(query_runner.calculate()) + elif query_kind == "HogQLMetadata": + metadata_query = HogQLMetadata.model_validate(query_json) + metadata_response = get_hogql_metadata(query=metadata_query, team=team) + return _unwrap_pydantic_dict(metadata_response) + elif query_kind == "DatabaseSchemaQuery": + database = create_hogql_database(team.pk, modifiers=create_default_modifiers_for_team(team)) + return serialize_database(database) + elif query_kind == "TimeToSeeDataSessionsQuery": + sessions_query_serializer = SessionsQuerySerializer(data=query_json) + sessions_query_serializer.is_valid(raise_exception=True) + return {"results": get_sessions(sessions_query_serializer).data} + elif query_kind == "TimeToSeeDataQuery": + serializer = SessionEventsQuerySerializer( + data={ + "team_id": team.pk, + "session_start": query_json["sessionStart"], + "session_end": query_json["sessionEnd"], + "session_id": query_json["sessionId"], + } + ) + serializer.is_valid(raise_exception=True) + return get_session_events(serializer) or {} + else: + if query_json.get("source"): + return process_query(team, query_json["source"]) + + raise ValidationError(f"Unsupported query kind: {query_kind}") diff --git a/posthog/api/test/test_query.py b/posthog/api/test/test_query.py index b49cd25b83287..ff03704605014 100644 --- a/posthog/api/test/test_query.py +++ b/posthog/api/test/test_query.py @@ -1,11 +1,11 @@ import json +from unittest import mock from unittest.mock import patch -from urllib.parse import quote from freezegun import freeze_time from rest_framework import status -from posthog.api.query import process_query +from posthog.api.services.query import process_query from posthog.models.property_definition import PropertyDefinition, PropertyType from posthog.models.utils import UUIDT from posthog.schema import ( @@ -336,51 +336,9 @@ def test_person_property_filter(self): response = self.client.post(f"/api/projects/{self.team.id}/query/", {"query": query.dict()}).json() self.assertEqual(len(response["results"]), 2) - def test_json_undefined_constant_error(self): - response = self.client.get( - f"/api/projects/{self.team.id}/query/?query=%7B%22kind%22%3A%22EventsQuery%22%2C%22select%22%3A%5B%22*%22%5D%2C%22limit%22%3AInfinity%7D" - ) - self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) - self.assertEqual( - response.json(), - { - "type": "validation_error", - "code": "invalid_input", - "detail": "Unsupported constant found in JSON: Infinity", - "attr": None, - }, - ) - - response = self.client.get( - f"/api/projects/{self.team.id}/query/?query=%7B%22kind%22%3A%22EventsQuery%22%2C%22select%22%3A%5B%22*%22%5D%2C%22limit%22%3ANaN%7D" - ) - self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) - self.assertEqual( - response.json(), - { - "type": "validation_error", - "code": "invalid_input", - "detail": "Unsupported constant found in JSON: NaN", - "attr": None, - }, - ) - def test_safe_clickhouse_error_passed_through(self): query = {"kind": "EventsQuery", "select": ["timestamp + 'string'"]} - # Safe errors are passed through in GET requests - response_get = self.client.get(f"/api/projects/{self.team.id}/query/?query={quote(json.dumps(query))}") - self.assertEqual(response_get.status_code, status.HTTP_400_BAD_REQUEST) - self.assertEqual( - response_get.json(), - self.validation_error_response( - "Illegal types DateTime64(6, 'UTC') and String of arguments of function plus: " - "While processing toTimeZone(timestamp, 'UTC') + 'string'.", - "illegal_type_of_argument", - ), - ) - - # Safe errors are passed through in POST requests too response_post = self.client.post(f"/api/projects/{self.team.id}/query/", {"query": query}) self.assertEqual(response_post.status_code, status.HTTP_400_BAD_REQUEST) self.assertEqual( @@ -396,11 +354,6 @@ def test_safe_clickhouse_error_passed_through(self): def test_unsafe_clickhouse_error_is_swallowed(self, sqlparse_format_mock): query = {"kind": "EventsQuery", "select": ["timestamp"]} - # Unsafe errors are swallowed in GET requests (in this case we should not expose malformed SQL) - response_get = self.client.get(f"/api/projects/{self.team.id}/query/?query={quote(json.dumps(query))}") - self.assertEqual(response_get.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR) - - # Unsafe errors are swallowed in POST requests too response_post = self.client.post(f"/api/projects/{self.team.id}/query/", {"query": query}) self.assertEqual(response_post.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR) @@ -832,3 +785,87 @@ def test_full_hogql_query_values(self): ) self.assertEqual(response.get("results", [])[0][0], 20) + + +class TestQueryRetrieve(APIBaseTest): + def setUp(self): + super().setUp() + self.team_id = self.team.pk + self.valid_query_id = "12345" + self.invalid_query_id = "invalid-query-id" + self.redis_client_mock = mock.Mock() + self.redis_get_patch = mock.patch("posthog.redis.get_client", return_value=self.redis_client_mock) + self.redis_get_patch.start() + + def tearDown(self): + self.redis_get_patch.stop() + + def test_with_valid_query_id(self): + self.redis_client_mock.get.return_value = json.dumps( + { + "id": self.valid_query_id, + "team_id": self.team_id, + "error": False, + "complete": True, + "results": ["result1", "result2"], + } + ).encode() + response = self.client.get(f"/api/projects/{self.team.id}/query/{self.valid_query_id}/") + self.assertEqual(response.status_code, 200) + self.assertEqual(response.json()["complete"], True, response.content) + + def test_with_invalid_query_id(self): + self.redis_client_mock.get.return_value = None + response = self.client.get(f"/api/projects/{self.team.id}/query/{self.invalid_query_id}/") + self.assertEqual(response.status_code, 404) + + def test_completed_query(self): + self.redis_client_mock.get.return_value = json.dumps( + { + "id": self.valid_query_id, + "team_id": self.team_id, + "complete": True, + "results": ["result1", "result2"], + } + ).encode() + response = self.client.get(f"/api/projects/{self.team.id}/query/{self.valid_query_id}/") + self.assertEqual(response.status_code, 200) + self.assertTrue(response.json()["complete"]) + + def test_running_query(self): + self.redis_client_mock.get.return_value = json.dumps( + { + "id": self.valid_query_id, + "team_id": self.team_id, + "complete": False, + } + ).encode() + response = self.client.get(f"/api/projects/{self.team.id}/query/{self.valid_query_id}/") + self.assertEqual(response.status_code, 200) + self.assertFalse(response.json()["complete"]) + + def test_failed_query(self): + self.redis_client_mock.get.return_value = json.dumps( + { + "id": self.valid_query_id, + "team_id": self.team_id, + "error": True, + "error_message": "Query failed", + } + ).encode() + response = self.client.get(f"/api/projects/{self.team.id}/query/{self.valid_query_id}/") + self.assertEqual(response.status_code, 200) + self.assertTrue(response.json()["error"]) + + def test_destroy(self): + self.redis_client_mock.get.return_value = json.dumps( + { + "id": self.valid_query_id, + "team_id": self.team_id, + "error": True, + "error_message": "Query failed", + } + ).encode() + response = self.client.delete(f"/api/projects/{self.team.id}/query/{self.valid_query_id}/") + self.assertEqual(response.status_code, 204) + self.redis_client_mock.delete.assert_called_once() diff --git a/posthog/caching/calculate_results.py b/posthog/caching/calculate_results.py index be11c4ffe48b5..f7ee632e2ad48 100644 --- a/posthog/caching/calculate_results.py +++ b/posthog/caching/calculate_results.py @@ -141,7 +141,7 @@ def calculate_for_query_based_insight( ) # local import to avoid circular reference - from posthog.api.query import process_query + from posthog.api.services.query import process_query # TODO need to properly check that hogql is enabled? return cache_key, cache_type, process_query(team, insight.query, True) diff --git a/posthog/celery.py b/posthog/celery.py index 374c90db7e4ec..53c67214783ee 100644 --- a/posthog/celery.py +++ b/posthog/celery.py @@ -395,24 +395,19 @@ def redis_heartbeat(): @app.task(ignore_result=True, bind=True) -def enqueue_clickhouse_execute_with_progress( - self, team_id, query_id, query, args=None, settings=None, with_column_types=False -): +def process_query_task(self, team_id, query_id, query_json, in_export_context=False, refresh_requested=False): """ - Kick off query with progress reporting - Iterate over the progress status - Save status to redis + Kick off query Once complete save results to redis """ - from posthog.client import execute_with_progress - - execute_with_progress( - team_id, - query_id, - query, - args, - settings, - with_column_types, + from posthog.client import execute_process_query + + execute_process_query( + team_id=team_id, + query_id=query_id, + query_json=query_json, + in_export_context=in_export_context, + refresh_requested=refresh_requested, task_id=self.request.id, ) diff --git a/posthog/clickhouse/cancel.py b/posthog/clickhouse/cancel.py new file mode 100644 index 0000000000000..e05eea7ad3d64 --- /dev/null +++ b/posthog/clickhouse/cancel.py @@ -0,0 +1,14 @@ +from statshog.defaults.django import statsd + +from posthog.api.services.query import logger +from posthog.clickhouse.client import sync_execute +from posthog.settings import CLICKHOUSE_CLUSTER + + +def cancel_query_on_cluster(team_id: int, client_query_id: str) -> None: + result = sync_execute( + f"KILL QUERY ON CLUSTER '{CLICKHOUSE_CLUSTER}' WHERE query_id LIKE %(client_query_id)s", + {"client_query_id": f"{team_id}_{client_query_id}%"}, + ) + logger.info("Cancelled query %s for team %s, result: %s", client_query_id, team_id, result) + statsd.incr("clickhouse.query.cancellation_requested", tags={"team_id": team_id}) diff --git a/posthog/clickhouse/client/__init__.py b/posthog/clickhouse/client/__init__.py index f2ad255c395e1..a249ebbabb4ad 100644 --- a/posthog/clickhouse/client/__init__.py +++ b/posthog/clickhouse/client/__init__.py @@ -1,8 +1,8 @@ from posthog.clickhouse.client.execute import query_with_columns, sync_execute -from posthog.clickhouse.client.execute_async import execute_with_progress +from posthog.clickhouse.client.execute_async import execute_process_query __all__ = [ "sync_execute", "query_with_columns", - "execute_with_progress", + "execute_process_query", ] diff --git a/posthog/clickhouse/client/execute_async.py b/posthog/clickhouse/client/execute_async.py index 3bb28c3f20075..fc9e292b08ee4 100644 --- a/posthog/clickhouse/client/execute_async.py +++ b/posthog/clickhouse/client/execute_async.py @@ -1,172 +1,94 @@ -import hashlib +import datetime import json -import time -from dataclasses import asdict as dataclass_asdict -from dataclasses import dataclass -from time import perf_counter -from typing import Any, Optional - -from posthog import celery -from clickhouse_driver import Client as SyncClient -from django.conf import settings as app_settings -from statshog.defaults.django import statsd - -from posthog import redis -from posthog.celery import enqueue_clickhouse_execute_with_progress -from posthog.clickhouse.client.execute import _prepare_query -from posthog.errors import wrap_query_error -from posthog.settings import ( - CLICKHOUSE_CA, - CLICKHOUSE_DATABASE, - CLICKHOUSE_HOST, - CLICKHOUSE_PASSWORD, - CLICKHOUSE_SECURE, - CLICKHOUSE_USER, - CLICKHOUSE_VERIFY, -) - -REDIS_STATUS_TTL = 600 # 10 minutes - - -@dataclass -class QueryStatus: - team_id: int - num_rows: float = 0 - total_rows: float = 0 - error: bool = False - complete: bool = False - error_message: str = "" - results: Any = None - start_time: Optional[float] = None - end_time: Optional[float] = None - task_id: Optional[str] = None - - -def generate_redis_results_key(query_id): - REDIS_KEY_PREFIX_ASYNC_RESULTS = "query_with_progress" - key = f"{REDIS_KEY_PREFIX_ASYNC_RESULTS}:{query_id}" - return key - - -def execute_with_progress( +import uuid + +import structlog +from rest_framework.exceptions import NotFound + +from posthog import celery, redis +from posthog.celery import process_query_task +from posthog.clickhouse.query_tagging import tag_queries +from posthog.schema import QueryStatus + +logger = structlog.get_logger(__name__) + +REDIS_STATUS_TTL_SECONDS = 600 # 10 minutes +REDIS_KEY_PREFIX_ASYNC_RESULTS = "query_async" + + +class QueryNotFoundError(NotFound): + pass + + +class QueryRetrievalError(Exception): + pass + + +def generate_redis_results_key(query_id: str, team_id: int) -> str: + return f"{REDIS_KEY_PREFIX_ASYNC_RESULTS}:{team_id}:{query_id}" + + +def execute_process_query( team_id, query_id, - query, - args=None, - settings=None, - with_column_types=False, - update_freq=0.2, + query_json, + in_export_context, + refresh_requested, task_id=None, ): - """ - Kick off query with progress reporting - Iterate over the progress status - Save status to redis - Once complete save results to redis - """ - - key = generate_redis_results_key(query_id) - ch_client = SyncClient( - host=CLICKHOUSE_HOST, - database=CLICKHOUSE_DATABASE, - secure=CLICKHOUSE_SECURE, - user=CLICKHOUSE_USER, - password=CLICKHOUSE_PASSWORD, - ca_certs=CLICKHOUSE_CA, - verify=CLICKHOUSE_VERIFY, - settings={"max_result_rows": "10000"}, - ) + key = generate_redis_results_key(query_id, team_id) redis_client = redis.get_client() - start_time = perf_counter() - - prepared_sql, prepared_args, tags = _prepare_query(client=ch_client, query=query, args=args) + from posthog.models import Team + from posthog.api.services.query import process_query - query_status = QueryStatus(team_id, task_id=task_id) + team = Team.objects.get(pk=team_id) - start_time = time.time() + query_status = QueryStatus( + id=query_id, + team_id=team_id, + task_id=task_id, + complete=False, + error=True, # Assume error in case nothing below ends up working + start_time=datetime.datetime.utcnow(), + ) + value = query_status.model_dump_json() try: - progress = ch_client.execute_with_progress( - prepared_sql, - params=prepared_args, - settings=settings, - with_column_types=with_column_types, + tag_queries(client_query_id=query_id, team_id=team_id) + results = process_query( + team=team, query_json=query_json, in_export_context=in_export_context, refresh_requested=refresh_requested ) - for num_rows, total_rows in progress: - query_status = QueryStatus( - team_id=team_id, - num_rows=num_rows, - total_rows=total_rows, - complete=False, - error=False, - error_message="", - results=None, - start_time=start_time, - task_id=task_id, - ) - redis_client.set(key, json.dumps(dataclass_asdict(query_status)), ex=REDIS_STATUS_TTL) - time.sleep(update_freq) - else: - rv = progress.get_result() - query_status = QueryStatus( - team_id=team_id, - num_rows=query_status.num_rows, - total_rows=query_status.total_rows, - complete=True, - error=False, - start_time=query_status.start_time, - end_time=time.time(), - error_message="", - results=rv, - task_id=task_id, - ) - redis_client.set(key, json.dumps(dataclass_asdict(query_status)), ex=REDIS_STATUS_TTL) - + logger.info("Got results for team %s query %s", team_id, query_id) + query_status.complete = True + query_status.error = False + query_status.results = results + query_status.expiration_time = datetime.datetime.utcnow() + datetime.timedelta(seconds=REDIS_STATUS_TTL_SECONDS) + query_status.end_time = datetime.datetime.utcnow() + value = query_status.model_dump_json() except Exception as err: - err = wrap_query_error(err) - tags["failed"] = True - tags["reason"] = type(err).__name__ - statsd.incr("clickhouse_sync_execution_failure") - query_status = QueryStatus( - team_id=team_id, - num_rows=query_status.num_rows, - total_rows=query_status.total_rows, - complete=False, - error=True, - start_time=query_status.start_time, - end_time=time.time(), - error_message=str(err), - results=None, - task_id=task_id, - ) - redis_client.set(key, json.dumps(dataclass_asdict(query_status)), ex=REDIS_STATUS_TTL) - + query_status.results = None # Clear results in case they are faulty + query_status.error_message = str(err) + logger.error("Error processing query for team %s query %s: %s", team_id, query_id, err) + value = query_status.model_dump_json() raise err finally: - ch_client.disconnect() + redis_client.set(key, value, ex=REDIS_STATUS_TTL_SECONDS) - execution_time = perf_counter() - start_time - statsd.timing("clickhouse_sync_execution_time", execution_time * 1000.0) - - if app_settings.SHELL_PLUS_PRINT_SQL: - print("Execution time: %.6fs" % (execution_time,)) # noqa T201 - - -def enqueue_execute_with_progress( +def enqueue_process_query_task( team_id, - query, - args=None, - settings=None, - with_column_types=False, - bypass_celery=False, + query_json, query_id=None, + refresh_requested=False, + in_export_context=False, + bypass_celery=False, force=False, ): if not query_id: - query_id = _query_hash(query, team_id, args) - key = generate_redis_results_key(query_id) + query_id = uuid.uuid4().hex + + key = generate_redis_results_key(query_id, team_id) redis_client = redis.get_client() if force: @@ -187,49 +109,55 @@ def enqueue_execute_with_progress( # If we've seen this query before return the query_id and don't resubmit it. return query_id - # Immediately set status so we don't have race with celery - query_status = QueryStatus(team_id=team_id, start_time=time.time()) - redis_client.set(key, json.dumps(dataclass_asdict(query_status)), ex=REDIS_STATUS_TTL) + # Immediately set status, so we don't have race with celery + query_status = QueryStatus(id=query_id, team_id=team_id) + redis_client.set(key, query_status.model_dump_json(), ex=REDIS_STATUS_TTL_SECONDS) if bypass_celery: # Call directly ( for testing ) - enqueue_clickhouse_execute_with_progress(team_id, query_id, query, args, settings, with_column_types) + process_query_task( + team_id, query_id, query_json, in_export_context=in_export_context, refresh_requested=refresh_requested + ) else: - enqueue_clickhouse_execute_with_progress.delay(team_id, query_id, query, args, settings, with_column_types) + task = process_query_task.delay( + team_id, query_id, query_json, in_export_context=in_export_context, refresh_requested=refresh_requested + ) + query_status.task_id = task.id + redis_client.set(key, query_status.model_dump_json(), ex=REDIS_STATUS_TTL_SECONDS) return query_id -def get_status_or_results(team_id, query_id): - """ - Returns QueryStatus data class - QueryStatus data class contains either: - Current status of running query - Results of completed query - Error payload of failed query - """ +def get_query_status(team_id, query_id): redis_client = redis.get_client() - key = generate_redis_results_key(query_id) + key = generate_redis_results_key(query_id, team_id) + try: byte_results = redis_client.get(key) - if byte_results: - str_results = byte_results.decode("utf-8") - else: - return QueryStatus(team_id, error=True, error_message="Query is unknown to backend") - query_status = QueryStatus(**json.loads(str_results)) - if query_status.team_id != team_id: - raise Exception("Requesting team is not executing team") except Exception as e: - query_status = QueryStatus(team_id, error=True, error_message=str(e)) - return query_status + raise QueryRetrievalError(f"Error retrieving query {query_id} for team {team_id}") from e + if not byte_results: + raise QueryNotFoundError(f"Query {query_id} not found for team {team_id}") -def _query_hash(query: str, team_id: int, args: Any) -> str: - """ - Takes a query and returns a hex encoded hash of the query and args - """ - if args: - key = hashlib.md5((str(team_id) + query + json.dumps(args)).encode("utf-8")).hexdigest() - else: - key = hashlib.md5((str(team_id) + query).encode("utf-8")).hexdigest() - return key + return QueryStatus(**json.loads(byte_results)) + + +def cancel_query(team_id, query_id): + query_status = get_query_status(team_id, query_id) + + if query_status.task_id: + logger.info("Got task id %s, attempting to revoke", query_status.task_id) + celery.app.control.revoke(query_status.task_id, terminate=True) + + from posthog.clickhouse.cancel import cancel_query_on_cluster + + logger.info("Revoked task id %s, attempting to cancel on cluster", query_status.task_id) + cancel_query_on_cluster(team_id, query_id) + + redis_client = redis.get_client() + key = generate_redis_results_key(query_id, team_id) + logger.info("Deleting redis query key %s", key) + redis_client.delete(key) + + return True diff --git a/posthog/clickhouse/client/test/test_execute_async.py b/posthog/clickhouse/client/test/test_execute_async.py new file mode 100644 index 0000000000000..1ab4bf49e03d3 --- /dev/null +++ b/posthog/clickhouse/client/test/test_execute_async.py @@ -0,0 +1,152 @@ +import uuid +from unittest.mock import patch + +from django.test import TestCase + +from posthog.clickhouse.client import execute_async as client +from posthog.client import sync_execute +from posthog.hogql.errors import HogQLException +from posthog.models import Organization, Team +from posthog.test.base import ClickhouseTestMixin + + +def build_query(sql): + return { + "kind": "HogQLQuery", + "query": sql, + } + + +class ClickhouseClientTestCase(TestCase, ClickhouseTestMixin): + def setUp(self): + self.organization = Organization.objects.create(name="test") + self.team = Team.objects.create(organization=self.organization) + self.team_id = self.team.pk + + def test_async_query_client(self): + query = build_query("SELECT 1+1") + team_id = self.team_id + query_id = client.enqueue_process_query_task(team_id, query, bypass_celery=True) + result = client.get_query_status(team_id, query_id) + self.assertFalse(result.error, result.error_message) + self.assertTrue(result.complete) + self.assertEqual(result.results["results"], [[2]]) + + def test_async_query_client_errors(self): + query = build_query("SELECT WOW SUCH DATA FROM NOWHERE THIS WILL CERTAINLY WORK") + self.assertRaises( + HogQLException, + client.enqueue_process_query_task, + **{"team_id": (self.team_id), "query_json": query, "bypass_celery": True}, + ) + query_id = uuid.uuid4().hex + try: + client.enqueue_process_query_task(self.team_id, query, query_id=query_id, bypass_celery=True) + except Exception: + pass + + result = client.get_query_status(self.team_id, query_id) + self.assertTrue(result.error) + self.assertRegex(result.error_message, "Unknown table") + + def test_async_query_client_uuid(self): + query = build_query("SELECT toUUID('00000000-0000-0000-0000-000000000000')") + team_id = self.team_id + query_id = client.enqueue_process_query_task(team_id, query, bypass_celery=True) + result = client.get_query_status(team_id, query_id) + self.assertFalse(result.error, result.error_message) + self.assertTrue(result.complete) + self.assertEqual(result.results["results"], [["00000000-0000-0000-0000-000000000000"]]) + + def test_async_query_client_does_not_leak(self): + query = build_query("SELECT 1+1") + team_id = self.team_id + wrong_team = 5 + query_id = client.enqueue_process_query_task(team_id, query, bypass_celery=True) + + try: + client.get_query_status(wrong_team, query_id) + except Exception as e: + self.assertEqual(str(e), f"Query {query_id} not found for team {wrong_team}") + + @patch("posthog.clickhouse.client.execute_async.process_query_task") + def test_async_query_client_is_lazy(self, execute_sync_mock): + query = build_query("SELECT 4 + 4") + query_id = uuid.uuid4().hex + team_id = self.team_id + client.enqueue_process_query_task(team_id, query, query_id=query_id, bypass_celery=True) + + # Try the same query again + client.enqueue_process_query_task(team_id, query, query_id=query_id, bypass_celery=True) + + # Try the same query again (for good measure!) + client.enqueue_process_query_task(team_id, query, query_id=query_id, bypass_celery=True) + + # Assert that we only called clickhouse once + execute_sync_mock.assert_called_once() + + @patch("posthog.clickhouse.client.execute_async.process_query_task") + def test_async_query_client_is_lazy_but_not_too_lazy(self, execute_sync_mock): + query = build_query("SELECT 8 + 8") + query_id = uuid.uuid4().hex + team_id = self.team_id + client.enqueue_process_query_task(team_id, query, query_id=query_id, bypass_celery=True) + + # Try the same query again, but with force + client.enqueue_process_query_task(team_id, query, query_id=query_id, bypass_celery=True, force=True) + + # Try the same query again (for good measure!) + client.enqueue_process_query_task(team_id, query, query_id=query_id, bypass_celery=True) + + # Assert that we called clickhouse twice + self.assertEqual(execute_sync_mock.call_count, 2) + + @patch("posthog.clickhouse.client.execute_async.process_query_task") + def test_async_query_client_manual_query_uuid(self, execute_sync_mock): + # This is a unique test because technically in the test pattern `SELECT 8 + 8` is already + # in redis. This tests to make sure it is treated as a unique run of that query + query = build_query("SELECT 8 + 8") + team_id = self.team_id + query_id = "I'm so unique" + client.enqueue_process_query_task(team_id, query, query_id=query_id, bypass_celery=True) + + # Try the same query again, but with force + client.enqueue_process_query_task(team_id, query, query_id=query_id, bypass_celery=True, force=True) + + # Try the same query again (for good measure!) + client.enqueue_process_query_task(team_id, query, query_id=query_id, bypass_celery=True) + + # Assert that we called clickhouse twice + self.assertEqual(execute_sync_mock.call_count, 2) + + def test_client_strips_comments_from_request(self): + """ + To ensure we can easily copy queries from `system.query_log` in e.g. + Metabase, we strip comments from the query we send. Metabase doesn't + display multilined output. + + See https://github.com/metabase/metabase/issues/14253 + + Note I'm not really testing much complexity, I trust that those will + come out as failures in other tests. + """ + from posthog.clickhouse.query_tagging import tag_queries + + # First add in the request information that should be added to the sql. + # We check this to make sure it is not removed by the comment stripping + with self.capture_select_queries() as sqls: + tag_queries(kind="request", id="1") + sync_execute( + query=""" + -- this request returns 1 + SELECT 1 + """ + ) + self.assertEqual(len(sqls), 1) + first_query = sqls[0] + self.assertIn(f"SELECT 1", first_query) + self.assertNotIn("this request returns", first_query) + + # Make sure it still includes the "annotation" comment that includes + # request routing information for debugging purposes + self.assertIn("/* request:1 */", first_query) diff --git a/posthog/schema.py b/posthog/schema.py index be7bb8619a4ce..a2057f903768f 100644 --- a/posthog/schema.py +++ b/posthog/schema.py @@ -3,6 +3,7 @@ from __future__ import annotations +from datetime import datetime from enum import Enum from typing import Any, Dict, List, Optional, Union @@ -439,6 +440,23 @@ class PropertyOperator(str, Enum): max = "max" +class QueryStatus(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + complete: Optional[bool] = False + end_time: Optional[datetime] = None + error: Optional[bool] = False + error_message: Optional[str] = "" + expiration_time: Optional[datetime] = None + id: str + query_async: Optional[bool] = True + results: Optional[Any] = None + start_time: Optional[datetime] = None + task_id: Optional[str] = None + team_id: int + + class QueryTiming(BaseModel): model_config = ConfigDict( extra="forbid", diff --git a/posthog/tasks/exports/csv_exporter.py b/posthog/tasks/exports/csv_exporter.py index 622798774ec1d..8f6fffd0c9f90 100644 --- a/posthog/tasks/exports/csv_exporter.py +++ b/posthog/tasks/exports/csv_exporter.py @@ -7,7 +7,7 @@ from django.http import QueryDict from sentry_sdk import capture_exception, push_scope -from posthog.api.query import process_query +from posthog.api.services.query import process_query from posthog.jwt import PosthogJwtAudience, encode_jwt from posthog.models.exported_asset import ExportedAsset, save_content from posthog.utils import absolute_uri diff --git a/posthog/warehouse/api/test/test_view_link.py b/posthog/warehouse/api/test/test_view_link.py index 3a2dcae6bf160..0bcb57e187b86 100644 --- a/posthog/warehouse/api/test/test_view_link.py +++ b/posthog/warehouse/api/test/test_view_link.py @@ -2,7 +2,7 @@ APIBaseTest, ) from posthog.warehouse.models import DataWarehouseViewLink, DataWarehouseSavedQuery -from posthog.api.query import process_query +from posthog.api.services.query import process_query class TestViewLinkQuery(APIBaseTest): diff --git a/posthog/warehouse/models/datawarehouse_saved_query.py b/posthog/warehouse/models/datawarehouse_saved_query.py index bca809bb30912..9117fa7c4eaf0 100644 --- a/posthog/warehouse/models/datawarehouse_saved_query.py +++ b/posthog/warehouse/models/datawarehouse_saved_query.py @@ -47,7 +47,7 @@ class Meta: ] def get_columns(self) -> Dict[str, str]: - from posthog.api.query import process_query + from posthog.api.services.query import process_query # TODO: catch and raise error response = process_query(self.team, self.query)