table.addメソッドのロック回避について/「不正な名前」エラーの回避について
メールサーバで受信したアラートメールをKompira Enterpriseに取り込み条件判断、要対応のアラートのみTeamsで通知するツールを作成しております。
本プロセス内で、アラートメールの通知要否判定結果および判定理由をテーブルに出力する処理(addメソッド)があります。
上記処理にて、以下2種類の実行エラーが発生しました。
①メソッド 'add' の実行に失敗: Failed to lock on row in kompira_baseobject
②メソッド 'add' の実行に失敗: 「[〇〇-〇〇-alert:XXXXX] YYYY/MM/DD 【アラートタイトル(日本語)】[【アラート発生元の環境ID】]」は不正な名前です。
※固有名称が含まれるため書式のみ共有します。
①について、本アラートメールは朝夕の同時刻に多量のアラートが出力される傾向にあり、その影響でテーブル更新のロックが発生したものと考えられます。
本エラーを解消する方法があればご教示いただけますでしょうか。
②について、何らかの不正文字(/,[],:など)が抵触したものと考えられますが、回避策としては、特殊文字の有無判別⇒ある場合、エスケープ文字列の付与といった処理が必要になるのでしょうか。
本件に関しても、何か参考ナレッジがあれば、ご教示いただきたいです。
以下、テーブル追加ジョブのスクリプトです。
| Subject |
| Date |
| Judge |
| Reason |
[./Result_Judge.add:
name = Subject,
overwrite = true
] ->
[ obj = $RESULT ] ->
[Reason >> obj.Reason]->
[Date >> obj.Date]->
[Judge >> obj.Judge]
-
正式なコメント
フィックスポイントの高橋です。
上記処理にて、以下2種類の実行エラーが発生しました。
①メソッド 'add' の実行に失敗: Failed to lock on row in kompira_baseobject
②メソッド 'add' の実行に失敗: 「[〇〇-〇〇-alert:XXXXX] YYYY/MM/DD 【アラートタイトル(日本語)】[【アラート発生元の環境ID】]」は不正な名前です。
まず、Kompira のオブジェクトの名称については、一般的なファイル名ほどの自由度はなく、以下のような制限があります。(オンラインマニュアル「操作ガイド」の「2.3.1. オブジェクトの名称」をご参照ください)
- アルファベット、数字、アンダーバー("_")、日本語を使うことができる
- 先頭の文字は数字以外でなければいけない
- アルファベットの大文字と小文字は区別される
- オブジェクトの名称の長さは128文字以内でなければいけない
- 絶対パスの長さは1024文字以内でなければいけない
空白やアンダーバー以外の記号が利用できないため、② で言えば、ハイフン(-)、コロン(:)、スラッシュ(/) や空白を名称に含めようとしてエラーになったのではないかと思います。
① につきましては(ロック処理自体のエラーである可能性もありますが)オブジェクト名称に一部の記号を含めて add() を呼び出したときに当該エラーが表示される場合がある、という既知の問題があり、今回はこちらが該当している可能性が高いのではないかと考えています。すなわち、②を解消できれば、①も発生しなくなる可能性があると思います。
回避策としては、特殊文字の有無判別⇒ある場合、エスケープ文字列の付与といった処理が必要になるのでしょうか。
パラメータの Subject が任意の文字列が渡されるものであるならば、それをオブジェクト名称に利用するには、上記制限に該当しないように、使えない文字の置換や長さの調整などを行なう必要があります。
使える文字自体に制限があるため、エスケープ文字列を付与するといった対処では不十分で、使える文字に変換しないといけません。
ジョブフロー言語はこのような処理には適していませんので、ライブラリオブジェクトを作成して Python で実装することを考えてみます。
たとえば、ジョブフローと同じディレクトリに "objectName" というライブラリオブジェクトを作成して、ソーステキストに以下のような Python のコードを記述して保存します。
import re
def sanitize(s, limit=128):
ret = re.sub('\W', '_', s)
if re.match('\d', s) is not None:
ret = '_' + ret
return ret[:limit]文字列を渡すと Kompira オブジェクトの名称として使えるように変換します。ここでは簡単に、文字以外の記号などはアンダースコアに置き換えて、先頭が数字であればアンダースコアを挿入し、指定した長さに切り詰めています。
さきほどジョブフローの Result_Judge.add の手前に以下のように、上記ライブラリオブジェクトで作成した sanitize() 関数に Subject パラメータを渡して呼び出すようにしてみてください。結果の name を .add のパラメータとして渡すことで、「不正な名前です」という事象は改善するのではないかと思います。
:
[name = ./objectName.sanitize(Subject)] ->
[./Result_Judge.add:
name = name,
overwrite = true
] ->
[ obj = $RESULT ] ->
:ちなみに、このコードに上記のエラーで示された Subject を渡すと name は以下のような文字列になりました。
_〇〇_〇〇_alert_XXXXX__YYYY_MM_DD__アラートタイトル_日本語____アラート発生元の環境ID__
上の Python コードでは、エラー判定も行っていませんし、使えない文字も単純にアンダースコアに置き換えているだけなので、実利用に際しては必要な処理や改良を加えてみてください。
参考になさってみてください。
コメントアクション
サインインしてコメントを残してください。
コメント
1件のコメント