/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 ĠGoogle ĠLLC Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttps :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġexample . grpc Ċ Ċ import Ġcom . google . api . Mon itored Resource Ċ import Ġcom . google . api . kg ax . Page Ċ import Ġcom . google . api . kg ax . grpc . Stub Factory Ċ import Ġcom . google . api . kg ax . grpc . pager Ċ import Ġcom . google . logging . v 2 . List Log Entries Request Ċ import Ġcom . google . logging . v 2 . List Log Entries Response Ċ import Ġcom . google . logging . v 2 . LogEntry Ċ import Ġcom . google . logging . v 2 . Logging Service V 2 Grpc Ċ import Ġcom . google . logging . v 2 . Write Log Entries Request Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . delay Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġjava . io . File Ċ import Ġjava . util . Date Ċ Ċ /** Ċ Ġ* ĠSimple Ġexample Ġof Ġcalling Ġthe ĠLogging ĠAPI Ġwith Ġa Ġgenerated ĠKotlin ĠgRPC Ġclient . Ċ Ġ* Ċ Ġ* ĠRun Ġthis Ġexample Ġusing Ġyour Ġservice Ġaccount Ġas Ġfollows : Ċ Ġ* Ċ Ġ* Ġ``` Ċ Ġ* Ġ$ ĠC RED ENTIAL S =< path _ to _ your _ service _ account . json > ĠPROJECT =< your _ gcp _ project _ id > Ġ./ gradle w Ġexamples : run Ġ-- args Ġlogging Ċ Ġ* Ġ``` Ċ Ġ*/ Ċ @ Experimental Cor outines Api Ċ fun Ġlogging Example ( credentials : ĠString ) Ġ= Ġrun Blocking Ġ{ ĊĠĠĠ Ġ// Ġcreate Ġa Ġstub Ġfactory ĊĠĠĠ Ġval Ġfactory Ġ= ĠStub Factory ( ĊĠĠĠĠĠĠĠ ĠLogging Service V 2 Grpc . Logging Service V 2 Future Stub :: class , ĊĠĠĠĠĠĠĠ Ġ" logging . googleapis . com ", Ġ 4 4 3 ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ// Ġcreate Ġa Ġstub ĊĠĠĠ Ġval Ġstub Ġ= ĠFile ( credentials ). inputStream (). use Ġ{ ĊĠĠĠĠĠĠĠ Ġfactory . from ServiceAccount ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" https :// www . googleapis . com / auth / cloud - platform ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" https :// www . googleapis . com / auth / cloud - platform . read - only ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" https :// www . googleapis . com / auth / logging . admin ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" https :// www . googleapis . com / auth / logging . read ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" https :// www . googleapis . com / auth / logging . write " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġget Ġthe Ġproject Ġid ĊĠĠĠ Ġval ĠprojectId Ġ= ĠSystem . getenv (" PROJECT ") ĊĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠRuntimeException (" You Ġmust Ġset Ġthe ĠPROJECT Ġenvironment Ġvariable Ġto Ġrun Ġthis Ġexample ") ĊĊĠĠĠ Ġ// Ġresources Ġto Ġuse ĊĠĠĠ Ġval Ġproject Ġ= Ġ" projects /$ projectId " ĊĠĠĠ Ġval Ġlog Ġ= Ġ"$ project / logs / test Log -${ Date (). time }" ĊĠĠĠ Ġval Ġglobal Resource Ġ= ĠMon itored Resource . newBuilder (). apply Ġ{ Ġtype Ġ= Ġ" global " Ġ}. build () ĊĊĠĠĠ Ġ// Ġensure Ġwe Ġhave Ġsome Ġlogs Ġto Ġread ĊĠĠĠ Ġval Ġnew Entries Ġ= ĠList ( 4 0 ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog Entry . newBuilder (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Name Ġ= Ġlog ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresource Ġ= Ġglobal Resource ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Payload Ġ= Ġ" log Ġnumber : Ġ${ it Ġ+ Ġ 1 }" ĊĠĠĠĠĠĠĠ Ġ}. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġwrite Ġthe Ġentries ĊĠĠĠ Ġprintln (" Writing Ġ${ new Entries . size } Ġlog Ġentries ...") ĊĠĠĠ Ġstub . execute Ġ{ ĊĠĠĠĠĠĠĠ Ġit . write Log Entries ( Write Log Entries Request . newBuilder (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Name Ġ= Ġlog ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresource Ġ= Ġglobal Resource ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd All Entries ( new Entries ) ĊĠĠĠĠĠĠĠ Ġ}. build ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġwait Ġa Ġfew Ġseconds Ġ( if Ġread Ġback Ġimmediately Ġthe ĠAPI Ġmay Ġnot Ġhave Ġsaved Ġthe Ġentries ) ĊĠĠĠ Ġdelay ( 1 0 _ 0 0 0 ) ĊĊĠĠĠ Ġ// Ġnow , Ġread Ġthose Ġentries Ġback ĊĠĠĠ Ġval Ġpages Ġ= Ġpager ( ĊĠĠĠĠĠĠĠ Ġmethod Ġ= Ġ{ Ġrequest Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstub . execute Ġ{ Ġit . list Log Entries ( request ) Ġ} ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġinitial Request Ġ= Ġ{ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠList Log Entries Request . newBuilder (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Resource Names ( project ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfilter Ġ= Ġ" log Name =$ log " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠorderBy Ġ= Ġ" timestamp Ġasc " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠpageSize Ġ= Ġ 1 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. build () ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġnext Request Ġ= Ġ{ Ġrequest , Ġtoken Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . to Builder (). apply Ġ{ Ġpage Token Ġ= Ġtoken Ġ}. build () ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġnext Page Ġ= Ġ{ Ġr : ĠList Log Entries Response Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPage ( r . entries List , Ġr . next PageToken ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ// Ġgo Ġthrough Ġall Ġthe Ġlogs , Ġone Ġpage Ġat Ġa Ġtime ĊĠĠĠ Ġvar Ġnum Read Ġ= Ġ 0 ĊĠĠĠ Ġprintln (" Reading Ġlog Ġentries ...") ĊĠĠĠ Ġfor Ġ( page Ġin Ġpages ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( entry Ġin Ġpage . elements ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnum Read ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" log Ġ: Ġ${ entry . text Payload }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprintln (" Read Ġa Ġtotal Ġof Ġ$ num Read Ġlog Ġentries !") ĊĊĠĠĠ Ġ// Ġsanity Ġcheck ĊĠĠĠ Ġif Ġ( new Entries . size Ġ!= Ġnum Read ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Oh Ġno ! ĠThe Ġnumber Ġof Ġlogs Ġread Ġdoes Ġnot Ġmatch Ġthe Ġnumber Ġof Ġwrites !") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġshutdown ĊĠĠĠ Ġfactory . shutdown () Ċ } Ċ