ラベル Log の投稿を表示しています。 すべての投稿を表示
ラベル Log の投稿を表示しています。 すべての投稿を表示

2024年8月11日日曜日

SAS Viya Monitoring for Kubernetes からログを抽出するカスタムステップ

SAS Viyaでエラーを調査するときにOpenSearchでログを抽出するが、それを簡単に実行するカスタムステップがSAS Communities Libraryに紹介されている。ログの抽出が面倒な理由は複数ある。

  • OpenSearchで抽出できるのは10,000件というAPIの上限がある。
  • その制限の範囲内で抽出しようとすると手間がかかる。
  • フィールドを毎回選ぶのが面倒だ。
それをSAS Studioから範囲を指定して簡単に抽出できるのが、以下のカスタムステップです。get-k8s-info.sh, sas-viya configuration downloadと共に調査のツールとして使い手があります。

2017年5月8日月曜日

SAS Log Utility 1.9.1.3

不具合修正中です。潜在的なバグのパターンを定義する機能に不具合あるので直します。あと、SAS9.4TS1M4に合わせて、キーワードを修正しないといけない。

2017年3月7日火曜日

SAS Log Utility 1.9.1.2

Vectorに新しいバージョンの公開を依頼しました。今回の修正内容は以下のとおりです。

  • EXPORTの機能制限を解除
  • 有効期限を2019年12月末に設定



使おうと思ったら有効期限切れていて、弱りました。エクスポートの制限解除するのが面倒なのでロジックをコメントアウトしました。これを使って、あるSASプログラムの構造を解き明かそうと下準備進めています。解析するプログラムはAPM、SASの監査のデータを作る仕組みです。

2016年10月20日木曜日

Object Spawnerのログが英語で出力される

またレアな事象にぶつかったのでメモしておきます。Object Spawnerのログが何故か英語で出力される問題にぶつかりました。OSのロケールは日本語にしているにも関わらずです。
Object Spawnerの設定に言語やエンコーディングは無かったので、1時間ほど調べながら悩みました。

応えは、Local System Accountの言語が英語(EN)になっていたためでした。構築した環境はSAS9.4、Windows Server 2012で、AWS上に構築しています。土台が英語環境だったのであとから、日本語に切り替えたのですがこれが原因でした。

調べたのはレジストリエディタで、Local System Accountのユーザ環境を手繰って、Control Panel, Languagesのエントリの下を見て言語が英語になっていることを確かめました。また、Objspawn.exeをコマンドプロンプトから直接叩いて、他のアカウントではメッセージが日本語ででることを確かめました。

回避策として、他のローカルアカウントをAdministratorsに加えて、ローカルポリーシーでLocal System Accountが持っているのと同じ権限を付与しました。Local System Account自体の言語の設定を変えることも考えましたが、レジストリをいじるぐらいしか手が思いつかず、危険なのでやめました。

2016年9月13日火曜日

Workspace ServerのログのエンコーディングをUTF-8 に変更する。

Intelligent Platform製品を使っていて困ることのひとつが、UTF-8を前提として開発されているので、エンコーディングを従来と同じSJISにすると、SAS Environment Managerでエラーがでたりします。前に書いたPostgreのDBも内部はUTF-8なので、SJISのログを入れると不都合が生じます。

で、悩んで試したところ、SASのエンコーディングはSJIS, ワークスペースサーバのログはUTF-8に変更することができました。logconfig.xml に一行書き加えるだけです。

     param name="Encoding" value="UTF-8"/>

こんな感じです。ただ、ここだけ変更してシステムとして矛盾しないかという検証が未だです。このログをACM, APMで吸い上げる以外に何か落とし穴がないかこれから検証です。


2016年8月7日日曜日

ERROR: トランスコード時に文字データが一部損失しました。

文字のエンコーディングで良くあるエラーですが、改めて問題を定義します。このエラーは、異なるエンコーディングへ文字が変換できなかったときに発生します。

理解を深めるために、具体的にエラーを引き起こすコードを示します。このコードはEUCのテキストファイルをわざとUTF-8で読み取ってデータセット化し、SJISのエンコーディングで保存しています。
data data1(encoding='utf-8');
 length name $16;
 input name;
 cards;
与太郎
助六
正蔵
円楽
八雲
;;
run;

data _null_;
 set data1;
 file 'c:\temp\euc.txt' encoding='jeuc';
 put name;
run;

data data2(encoding='utf-8');
 infile 'c:\temp\euc.txt' encoding='jeuc';
 length name $16;
 input name;
run;

data data3(encoding='utf-8');
 infile 'c:\temp\euc.txt' encoding='utf-8';
 length name $16;
 input name;
run;

data data4(encoding='sjis');
 set data3(encoding='utf-8');
run;

エラーは、SJISのデータセットを出力するときに発生します。
362  data data1(encoding='utf-8');
363      length name $16;
364      input name;
365      cards;

NOTE: データセットWORK.DATA1は5オブザベーション、1変数です。
NOTE: DATAステートメント処理(合計処理時間):
      処理時間           0.03 秒
      CPU時間            0.01 秒


371  ;;
372  run;
373
374  data _null_;
375      set data1;
376      file 'c:\temp\euc.txt' encoding='jeuc';
377      put name;
378  run;

NOTE: 出力ファイル'c:\temp\euc.txt' :
      ファイル名=c:\temp\euc.txt,
      レコードフォーマット=V,
      論理レコード長=65534,
      ファイルサイズ (バイト)=0,
      更新日時=2016年08月07日 13時28分31秒,
      作成日時=2016年08月07日 13時06分49秒

NOTE: 5レコードを出力ファイル'c:\temp\euc.txt'に書き込みました。
      最小レコード長は6です。
      最大レコード長は9です。
NOTE: データセットWORK.DATA1から5オブザベーションを読み込みました。
NOTE: DATAステートメント処理(合計処理時間):
      処理時間           0.01 秒
      CPU時間            0.01 秒


379
380  data data2(encoding='utf-8');
381      infile 'c:\temp\euc.txt' encoding='jeuc';
382      length name $16;
383      input name;
384  run;

NOTE: 入力ファイル'c:\temp\euc.txt' :
      ファイル名=c:\temp\euc.txt,
      レコードフォーマット=V,
      論理レコード長=65534,
      ファイルサイズ (バイト)=32,
      更新日時=2016年08月07日 13時28分31秒,
      作成日時=2016年08月07日 13時06分49秒

NOTE: 5レコードを入力ファイル'c:\temp\euc.txt'から読み込みました。
      最小レコード長は6です。
      最大レコード長は9です。
NOTE: データセットWORK.DATA2は5オブザベーション、1変数です。
NOTE: DATAステートメント処理(合計処理時間):
      処理時間           0.01 秒
      CPU時間            0.01 秒


385
386  data data3(encoding='utf-8');
387      infile 'c:\temp\euc.txt' encoding='utf-8';
388      length name $16;
389      input name;
390  run;

NOTE: 入力ファイル'c:\temp\euc.txt' :
      ファイル名=c:\temp\euc.txt,
      レコードフォーマット=V,
      論理レコード長=131068,
      ファイルサイズ (バイト)=32,
      更新日時=2016年08月07日 13時28分31秒,
      作成日時=2016年08月07日 13時06分49秒

NOTE: 5レコードを入力ファイル'c:\temp\euc.txt'から読み込みました。
      最小レコード長は4です。
      最大レコード長は6です。
NOTE: データセットWORK.DATA3は5オブザベーション、1変数です。
NOTE: DATAステートメント処理(合計処理時間):
      処理時間           0.03 秒
      CPU時間            0.01 秒


391
392  data data4(encoding='sjis');
393      set data3(encoding='utf-8');
394  run;

NOTE: データファイルWORK.DATA4.DATAは別なホストにネイティブな形式が使用
      されているか、またはエンコーディングがセッションエンコーディ
      ングと一致していません。クロス環境データアクセスが使用される
      ため、追加のCPUリソースが必要となり、パフォーマンスが低下しま
      す。
ERROR: データセットWORK.DATA4のトランスコード時に文字データが一部損失
       しました。新しいエンコーディングで表せない文字がデータに含ま
       れていたか、またはトランスコード時に切り捨てが発生しました。

NOTE: DATAステップは異常終了しました。
NOTE: エラーが発生したため、このステップの処理を中止しました。
NOTE: データセットWORK.DATA3から3オブザベーションを読み込みました。
WARNING: データセットWORK.DATA4は未完成です。このステップは、
         2オブザベーション、1変数で停止しました。
WARNING: このステップを中止したため、データセットWORK.DATA4を置き換えて
         いません。
NOTE: DATAステートメント処理(合計処理時間):
      処理時間           0.03 秒
      CPU時間            0.01 秒


work.data3は以下のように文字化けしています。EUCのファイルをUTF-8で読み込んだときに文字化けを起こしています。これをSJISで保存しようとしてエラーになっています。


今回、仕事ではまったのが、SASのインストール、構成において途中でエンコーディングの設定を変えてこのエラーにぶつかりました。しかも、文字化けして格納されたのがPostgreのデータベースの中でした。ログファイルや、データセットの中を見ても見つからずにSOURCE, MPRINTで元データを探しまわり時間を費やしました。

教訓ですが、SASをインストした後にエンコーディングを変えてから、構成しましょう。SAS Environment Managerの設定で時間が掛かったのは、このエラーのためです。

2016年4月15日金曜日

ERROR: The LRECL= value is out of range, found 0.00000E-309.

レアケースのエラーにぶつかったのでメモしておきます。PROC OPTMODELのエラーです。

ERROR: The LRECL= value is out of range, found 0.00000E-309. 

これLRECLを指定する箇所ないのに、レンジがおかしいとエラーになっています。広く事例を調べてみると、この極端に小さな値0.00000E-309.は、ひょこひょことOPTMODEL以外でも出ています。

原因は、入力データセットの中に必要な変数がなかったことによるものでした。よく分からない論理レコード長のエラーがでたら、入力データの変数を疑うという経験則を得ました。

2016年2月21日日曜日

SAS Log Utility 1.8.1.1, ログファイルのエンコーディングを判定

Vectorに新しいバージョンの公開を依頼しました。今回の修正内容は以下のとおりです。

  • 不具合の修正
  • SASログファイルのエンコーディングを自動判定
  • SJIS, JIS, EUC, UTF8N, UTF8, UTF7など複数のエンコーディングに対応
  • Optionsのメニューの構成を変更
  • 日本語のマッチングパターン(keyword.ini)を訂正



ログファイルのエンコーディング判定は、ココの情報が役立ちました。これが無ければ、短時間で実装できなかったです。

ListViewのソートは、DEBUGのシンボルを定義したときと、外したときで動作が異なっていました。原因分からず。機能的には、だいぶ落ち着いてきたと思います。そろそろメジャーバージョンを上げて、処理構造の無駄を取り除きたいです。

2016年2月15日月曜日

UTF-8のログ

読み込めないSASログがあった。調べてみたらUTF-8だった。特に機能仕様には明記していなかったが、扱えるのはANSI, SJISのファイルです。

UTF-8はBOMあり、BOMなしで扱いが異なる。
別途サンプルのProjectを作って、検証から始める。

仕方ないので、メモ帳でSJISに変換してしのぎます。

実装の参考記事は こちら です。

2016年2月14日日曜日

SAS Log Utilityの概要

2009年に書いたツールの概要を加筆します。
SAS Log Utilityの概要について説明します。

概要
SAS Log Utilityは、SASプログラムが出力するログファイルを分析して、パフォーマンス診断や入出力の解析に役立つ情報を作成します。SAS Log Utilityを使うと以下のことができます。
  • SASプログラムの処理時間をDATAステップで集計して、ボトルネックとなっている処理を見つけることができます。
  • SASプログラムがどのようなデータを読み書きしているか、DATAステップ又はプロシージャ単位で捉えて、データの流れを理解することができます。
  • MPRINTのログを捉えて、マクロ単位の処理時間を集計します。
  • 複数のSASプログラムがどのようなデータを読み書きし、プログラム間でのデータの連携を可視化します。
機能
  • SASログからDATAステップ/プロシージャ単位の処理時間を抽出
  • SASログから処理時間を抽出し、データセット単位で処理に要した時間を集計
  • SASログからDATAステップ/プロシージャの入出力を抽出し、データの生成、読み取り、更新、削除の流れを表形式に出力
  • 設定ファイルの切り替えで、日本語と英語のSASログに対応
  • エラーにつながるNOTE:のメッセージをSASログから捕捉
  • INIファイルを追加、修正して日本語、英語以外のSASログを解析可能
  • SASログからMPRINTのログを抽出し、マクロ単位の処理時間を集計
  • SASログの分析結果をExcelに出力

SAS Log Utility 1.7.1.16, 不具合修正と設定ファイルの切り替え機能を追加

Vectorに新しいバージョンの公開を依頼しました。今回の修正内容は以下のとおりです。

  • 不具合の修正
  • 日本語と英語の設定ファイルを分けて、nlsのサブフォルダ下に移動
  • システムのデフォルトの言語から、設定ファイルを切り替えるように修正
  • Optionsのメニューの構成を変更

今回、日本語、英語の設定を分けたのが大きな変更点です。仕組みとしてはnlsフォルダの下に、ISO言語省略名のサブフォルダを定義して、INIファイルを作成すれば、他の言語も追加できます。が、まだ検証できていません。

修正した不具合は以下のものです。

  • FILENAMEを使わないで直接ファイルのパスを指定しているときに、入出力を捕捉できない
  • データセット名の変更が正しくCRUD表に反映されない
  • 英語のSASログで、データセットの書き込み(W)が正しく反映されない

他の言語の対応は、時間のあるときに試したいです。
開発で謎なのが、Patterns... のボタンにアイコンを表示していたのですが、いつのまにか表示されなくなりました。IDEの中だと、鉛筆のマークが出ているのですが、実行すると消えてしまいます。この検証はまた時間のあるときに行います。

2016年2月9日火曜日

NLS下のフォルダを探して、メニューを設定する(2)

開発のメモです。
設定ボタンの配置を換えました。
設定ボタンに16x16のアイコンを設定しました。
ISO言語省略名の選択は、ラジオボタンのタイプに変更しました。
潜在的なバグを見つけ出すパターンの設定は、Potential Problemのタブの下に移動しました。
言語の設定を切り替えるたびに、設定ファイルを読み直すように実装しました。





今日は、有給休暇でした。
銀行の手続きで3時間も掛かりました。

2016年2月7日日曜日

NLS下のフォルダを探して、メニューを設定する

開発のメモ。SASに倣って、NLSのフォルダ下にある言語のサブフォルダを見て、設定を切り替えられるように作成中です。



2016年2月1日月曜日

SAS Log Utility, 多言語対応の仕組みを考える

多言語対応で必要なものは何?

設定ファイルは、ISO言語省略名ごとに保持できるようにしたい。

どこに、設定ファイルを保持するか?
!SASROOT\nls\ja の形に倣って設定ファイルを配置するか?
それとも、設定ファイルの後ろにISO言語省略名を付与するのか?

LOCALEの取得は、Windows.GetLocaleInfoでできる。

言語の切り替えは、メニューから行う。
切り替えはツールの再起動なしで、反映できるようにしたい。

言語を切り替えて、ダイアログの表示を切り替えられるか?
reinit.ReinitializeFormsは使えるのか?
reinit.LoadNewResourceModuleは使えるのか?

他に使い出のあるものは何?

マイグレーション案件、面倒なことが色々ある。
何か効率化できるネタはないか。
VAの構成って面倒、設定だけではなくエビデンスの取得もできる何かが欲しい。

移行で毎回手を焼くのが、過去データの移送と変換です。
量が多いので、並列化したり、夜間に差分検出して移送する、中断、再開の制御を入れています。

他には?
BI Serverの構成が面倒です。
SMCの管理は苦手なのです、私はね。



2016年1月30日土曜日

きっと役立つ、バグになりそうなNOTE:のチェック

SAS Log Utilityには、エラーでもなく、ワーニングでもないけど、バグになりそうなメッセージをチェックする機能があります。2013年頃投稿、2016年1月30日更新です。

  • 変数 ABC は初期化されていません
  • 以下の箇所で文字値を数値に変換しました
  • 以下の箇所で数値を文字値に変換しました
  • ステートメントに BY値を繰り返すデータセットが複数あります
  • 欠損値を含んだ計算により、以下の箇所で欠損値が生成されました
  • 切り捨てられた行があります
  • カラム999で0による割り算がありました
  • 関数XYZ(行999 カラム999の引数は無効です
  • LOST CARD.
  • NOEXECオプションが指定
  • ループが発生したため、DATAステップの実行を中止しました
  • 引用符で囲まれた文字列の後の識別子の意味は
  • 数値をプリントするには小さすぎるW.D出力形式
  • ライブラリABCは存在しません
  • クエリは元のデータに要約統計量の結果を再マージします
  • データセットABCにオブザベーションがありません
  • ファイルABC(memtype=DATA)は見つかりませんが、DELETEステートメントに存在します
  • ABCは未参照のラベル定義です
  • ABCに対して、無効なデータが行999カラム999にあります
  • ステートメントが行の終端に達したので、次の行を読み込みます
  • 要約化中にディスク処理が発生しました
  • CASE式にELSE句がありません

関数の引数無効とかは、意外と気がつきにくいです。

SAS Log Utility 1.6.1.8, 不具合修正

Vectorに登録の申請をしました。
修正したのは以下の点です。

  • NOTE:でチェックするパターンを追加
  • ステータスバーにISO言語省略名を表示
  • ログの行末に追加されている空白又はタブを削除して処理
  • ListViewのソートの不具合を修正

ステータスバーに言語省略名を表示したのは、多言語対応の準備です。
行末のタブ又は空白を削除するようにしたのは、SASログをEXCELファイルに貼って渡す人がいて、処理の区切りを正確に判定できなかったためです。これがメモリリークの原因のひとつになっていました。ちなみに、EXCELに貼り付けて渡すとダブルクォートがエスケープされて、正しくパースできないことがありますので、私はWinZipで圧縮して渡します。

ステータスバーの左に言語省略名追加


記録まで

2016年1月28日木曜日

SAS Log Inspector 1.3.1.2, リリース


機能は変えず、組み込みのマッチングパターンを24種類に増やしました。どんなパターンが定義されているかは、以下の画像をご覧ください。Vectorに公開の依頼を投げました。



SAS Log Inspectorの機能
  • 複数のログファイルからエラー、バグに繋がるNOTEを集計
  • 日本語と英語版のメッセージに対応
  • Excelファイルにログをチェックした結果をエクスポート
  • 任意のチェック項目を検査対象から外すことができる
  • Notepadを起動して、該当のログファイルを参照できる
  • マッチングパターンを画面から追加、修正できる

2016年1月27日水曜日

やること

ログを検査するパターン追加

NOTE: CASE式にELSE句がありません。すべてのWHEN句の条件に合わなかった場合、CASE式の結果は欠損値になります。

APPENDのパターン対応
NOTE: WORK.ABCをWORK.DEFに追加します。
NOTE: データセットWORK.ABCから0オブザベーションを読み込みました。
NOTE: 0オブザベーションが追加されました。
NOTE: データセットWORK.DEFは0オブザベーション、20変数です。
NOTE: PROCEDURE APPEND処理(合計処理時間):
      処理時間           0.00 秒
      CPU時間            0.01 秒

NOTE: Appending WORK.ONE to WORK.BASE.
WARNING: Variable c was not found on BASE file. The variable will not be added to the BASE file.
WARNING: Variable a has different lengths on BASE and DATA files (BASE 3 DATA 4).
WARNING: Variable b has different lengths on BASE and DATA files (BASE 5 DATA 4).
WARNING: Variable d was not found on DATA file.
NOTE: FORCE is specified, so dropping/truncating will occur.
NOTE: There were 4 observations read from the data set WORK.ONE.
NOTE: 4 observations added.
NOTE: The data set WORK.BASE has 4 observations and 4 variables.
NOTE: PROCEDURE APPEND used (Total process time):
      real time           0.15 seconds
      cpu time            0.06 seconds

2016年1月4日月曜日

AdvListViewのソートを使う方法

実装を何度も忘れたのでメモします。
AdvListViewでソートを使うためには以下の設定が必要です。

  • SortShow := True を設定
  • AdvListViewの各カラムにTagの番号を設定します。
  • イベント OnColumnClick のハンドラを定義しその中で
  • SortColumnをカラムのタグから指定

procedure TForm1.AdvListView1ColumnClick(Sender: TObject; Column: TListColumn);
var
  tag: integer;
begin

  tag := Column.Tag;
  AdvListView1.SortColumn := tag;

end;
便利!

SAS Log Utility 1.6.1.5, 文字列のパターンをINIファイルで定義

年末年始の休みを使って、SAS Log Utilityを更新しました。
  • 潜在的な問題のパターンをINIファイルに定義
  • ログを解析するためのパターンをINIファイルに定義

Vectorに新バージョンの登録を依頼しました。SAS Log Utilityは仕事でもっとも良く使うツールです。これまで、SASのバージョンアップの度に、マッチングのパターンを変えてはビルドしていました。とはいえ、いつも同じバージョンのSASを使っていないので、その都度直してビルドするのは面倒です。そんな理由で、設定のフォームを作って修正できるようにしました。

追加したOptionsのメニュー


バグに繋がりそうなNOTE:のパターン


処理時間、データセット名を捕捉するためのパターン定義
マッチングのパターンですが、"Keyword Setting"では、データセット名やファイル名などのメタ文字を定義できるようにしました。たとえば"[:dsn:]"でデータセット名のパターンを定義します。これは、Nリテラルのデータセット名をすっきりと定義、参照するために実装した機能です。


定義しているパターン(Keyword)の件数は固定です。このパターンは、行の種類を特定するためと、行の中に含まれる情報を抽出するための2種類があります。情報を抽出するとは、「999 オブザベーション」とかのデータ数、データセット名、ファイル名などを取り出すことです。

それと英語のパターン定義は、外しました。将来、多言語対応で設定を切り替えられるようにするため、いったんパターンから外しました。

INIファイルの書式が、桁固定で分かりにくいが、それはゆくゆく直します。いまは使えることの方が大事なので後回しです。