Viyaの運用を行うのであれば常備しておきたいツールです。テクニカルサポート問合せのときに使います。実行方法はREADMEのCommand-Line Mode Exampleを見てください。デプロイしたときの site.yaml のあるディレクトリを引数で指定します。
SAS Utility
SASプログラムとログを解析するユーティリティを開発するための備忘録です。This is a memo to develop utility that analyzes the SAS log.
2024年4月11日木曜日
2024年2月14日水曜日
マクロ変数の名前と値をログに出力する。
何度も忘れているのでメモします。これでマクロ変数名と値をログに出力できます。DATAステップのPUTと書き方が違うので、ぱっと思い出せない。
%put &=var;
マニュアルで %put のセクションには書かれていない。出典がどこにあるのか探す。
https://go.documentation.sas.com/doc/ja/sasstudiocdc/3.8/pgmsascdc/mcrolref/n189qvy83pmkt6n1bq2mmwtyb4oe.htm
2024年2月13日火曜日
PROC HTTP で HTTPSではなくHTTPを使って通信するときのオプション
最近はHTTPではなくHTTPSが当たり前に使われているが、内部の通信だとHTTPが使われていることがある。そのときに必要な PROC HTTPのオプションは、sslparms "SSLREQCERT"="ALLOW"; です。
マニュアルからこのSSLREQCERT=ALLOWの意味を引くと、「ALLOWは、クライアントがサーバ証明書を要求することを指定するが、証明書が提供されなかったり、無効な証明書が提供されたりしても、セッションは正常に進行する」です。PROC HTTPのデフォルトは、SSLREQCERT=DEMANDです。意味は「サーバ証明書が要求され、有効な証明書が提供されなければセッションが終了することを指定する」です。システムオプションでも設定できます。
よく curl、sas-viya CLIで --insecure, -k のオプションありますが。これは SSLREQCERT=NEVER と同じです。証明書のチェックはしません。ALLOWの方が証明書あり、無し、どちらでも対応できるので、例としてはALLOWが使われているのが多いと思います(推測)。
2024年1月17日水曜日
PROC HTTPでトークンを取得するサンプル
PROC HTTPでユーザ名とパスワードを指定してアクセストークンを取得するサンプルです。通常はOAUTH_BEARER=SAS_SERVICES を使うことが多いですが、稀にトークン取得したいというニーズがあります。このコードで?な箇所は認証のヘッダーにsas.cli:をエンコードした値を使っているところです。コロンの前がクライアントのツール、コロンの後にパスワードを指定するのが普通ですが、パスワードは空の状態でエンコードしています。このパラメータはSAS Viya CLIからauth loginするときに--verboseで出力されるデバッグの情報を見てそれに倣っています。クライアントのパスワードが空なのは理解できませんが、ログを見るとそうなっています。時間あるときにPostmanでも同じようにパラメータを指定して動くか確かめます。
/* PROC Sample of using HTTP to obtain an access token. */ %let client=sas.cli; %let cpassword=; %let username=alex; %let password=hogehoge; %let host=%sysget(SAS_SERVICES_URL); filename resp "/tmp/foo.txt"; data _null_; attrib buf length=$64; buf=put("&client.:&cpassword.", $base64x64.); put buf=; call symputx('code', compress(buf), 'G'); run; proc http method="POST" url="&host./SASLogon/oauth/token" in="grant_type=password%str(&)username=&username.%str(&)password=&password." out=resp timeout=15; headers "authorization"="Basic &code" "Content-Type"="application/x-www-form-urlencoded"; run; data _null_; infile resp truncover; input; put _INFILE_; run;
2023年11月21日火曜日
SAS StudioからOpenSearchのログを検索するサンプル
Viyaのログの調査の効率を上げるためにSAS Studioからクエリを投入できないか思案しています。できたのが以下のコードです。
/* Sample code to search OpenSearch by PROC HTTP. */ filename myresult temp; data _null_; attrib code length=$64; /* Change the following user name (admin) and password (hogehoge) to match your environment. */ code=put("admin:hogehoge", $base64x64.); put code=; call symputx('code', compress(code), 'G'); run; proc http url="https://v4m-search.logging.svc.cluster.local:9200/_search" in='{ "query": { "simple_query_string": { "query": "setinit", "fields": [ "message" ], "default_operator": "and" }}}' out=myresult timeout=30 /* clear_cache*/; sslparms "SSLREQCERT"="allow" SSLCERTLOC="/opt/sas/viya/home/SASSecurityCertificateFramework/tls/certs/ca-bundle.pem"; headers "content-type"="application/json" "authorization"="Basic &code."; debug level=0; run; data _null_; infile myresult; input; put _INFILE_; run;このコードが意味するところは、messageフィールドからsetinitを検索しています。URLのホスト名、ポート番号とPEMのファイルはSAS Compute ServerのPodに接続して探したり、kubectl describe endpointsやservicesで探しました。それらのホスト名とかポート番号は公式なドキュメントには書かれていないので実機検証で調べてたものです。なので内部の実装は知らぬ間に変わる可能性があることに留意してください。
2023年11月4日土曜日
Androidのタブレットで、ZOOMが起動できない場合の点検箇所
Androidの端末でChromeからZoomが起動しないときの点検箇所は、PC版サイトのチェックです。また「ブラウザから参加」しようとすると、以下のようなエラーが出るときにも有効でした。
- This site can't ask for your permission close any bubbles or overlays?
- 他のアプリのバブルやオーバーレイをすべて閉じてから、もう一度お試しください。
2023年10月4日水曜日
OpenSearch を curl から検索する例
SAS Viya Monitoring for Kubernetes でログを検索したい場合に以下のようにクエリを投入できる。結果はJSONなので、これを加工して欲しい情報を見やすく成型する。この curl のコマンドは OpenSearch の DEV Toolからコマンドを生成して、必要最小限のオプションまで削りました。
curl 'https://viya4.example.com/dashboards/api/console/proxy?path=_search&method=GET' \ -H 'osd-xsrf: opensearchDashboards' \ --data-raw '{ "query": { "simple_query_string": { "query": "setinit", "fields": [ "message" ], "default_operator": "and" }}}' \ --insecure -u 'admin:password'このコードが意味するところは、messageフィールドからsetinitを検索しています。-uでユーザ名とパスワードを指定しています。OpenSearch自体にクエリを投げる例はすぐに見つかりますが、クラスタ内部のサービスを指定する方法が判らず数時間調べました。