Ok, ca fonctionne de mon cote, je me suis juste trompé de oid :

snmpwalk -m ALL -v 2c -c public localhost iso.3.6.1.4.1.16563.4.1.1.1.5.4.73.82.73.83

Résultat :

iso.3.6.1.4.1.16563.4.1.1.1.5.4.73.82.73.83 = STRING: "IRIS for UNIX (Ubuntu Server LTS for x86-64 Containers) 2023.1 (Build 229U) Fri Apr 14 2023 17:37:52 EDT"

Maintenant que le snmpd fonctionne, je ne peux que vous recommander de vous pencher aussi sur les solutions comme OpenTelemetry, qui est un standard pour la collecte de métriques, traces et logs.

Plus d'infos ici : https://opentelemetry.io/

Et notre documentation ici : https://docs.intersystems.com/iris20233/csp/docbook/Doc.View.cls?KEY=GCM_rest

Super :

Pour information, les métrics interop ne sont pas activés par default.

Pour les activer :

do##class(Ens.Util.Statistics).EnableSAMForNamespace()

Plus d'information ici sur la doc

humm, ne pas confondre la PWG (Private WebGateway) et la WebGateway.

La private webgateway est un mini apache qui est embarqué dans iris. Il n'a pas a etre configuré.

De plus, dans la configue pour acceder à ce portail il ne faut pas oublier d'ajouter ton ip en white list

System_Manager=*.*.*.*

Pourquoi souhaites-tu le configurer ?

Si tu peux changer de namespace quand tu le souhaites pour ca deux facons :

  • avant d'executer iop tu changes la variable d'environnement IRISNAMESPACE.
export IRISNAMESPACE=TEST
iop -m path/to/my_settings.py
  • dans ton fichier my_settings.py tu peux changer le namespace avec la fonction suivante :
import iris
# switch namespace to the TEST namespace
iris.system.Process.SetNamespace("TEST")

# print the current namespace
print(iris.system.Process.NameSpace())

from TEST.bo import MyBo

CLASSES = {
    "MyIRIS.MyBo": MyBo
}

PRODUCTIONS = [
    {
        "MyIRIS.Production": {
            "@TestingEnable": "true",
            "@Name": "MyIRIS.Production",
            "Item": [
                {
                    "@Name": "Instance.Of.MyBo",
                    "@ClassName": "MyIRIS.MyBo",
                }
            ]
        }
    }
]

Salut,

Peux-tu essayer cette commande :

python -m grongier.pex._cli

Je vais regarder en parallèle, le problème avec windows (pas facile, j'ai pas de VM windows à disposition :()

Salut Cyril,

La méthode PutStream() prend un objet %Stream d'IRIS en paramètre. Il faut donc que tu convertisses ton fichier en %Stream avant de l'envoyer.

Exemple :

XMessage

from grongier.pex import Message
from dataclasses import dataclass

@dataclass
class XMessage(Message):
    StringStream: str
    BinaryStream: bytes

BusinessOperation

from grongier.pex import BusinessOperation
from datetime import datetime
from X.xImport import XMessage
import iris

class XArticleExport(BusinessOperation):
    def get_adapter_type():
        return "EnsLib.FTP.OutboundAdapter"

    def on_init(self):
        return super().on_init()

    def on_message(self, request: XMessage):
        if hasattr(request, "Stream"):
            # Préparation du stream
            stream = iris.cls("%Stream.GlobalCharacter")._New()
            source = ""
            # Si le stream est en string on l'utilise tel quel
            if request.StringStream:
                source = request.StringStream
            elif request.BinaryStream:
                source = request.BinaryStream.decode("utf-8")

            # On écrit le contenu du fichier dans le stream
            n = 4092
            chunks = [source[i:i+n] for i in range(0, len(source), n)]
            for chunk in chunks:
                stream.Write(chunk)

            filename = "exportArticles_" + datetime.now().strftime("%Y%m%d") + ".csv"
            esc: int = self.Adapter.PutStream(filename, stream)
            if esc == 1:
                self.log_info("File imported successfully with code : " + esc)
        else:
            self.log_error("Pas de stream reçu ! Code: " + esc)
        return super().on_message(request)

C'est bizarre, si l'inspect fonctionne, le runserver doit aussi fonctionner.

Tu peux visualiser les log d'audit pour avoir plus de détail sur l'erreur de connexion :

Dans cet exemple, j'ai essayé de me connecter avec un user grongier en lieu et place de SuperUser, la faute à :

"USER": os.environ.get("USER", "SuperUser"),

dans mon settings.py

Salut,

As tu essayé d'ajouter la commande over + un ordre dans ton ROW_NUMBER() ?

C'est recommandé car sinon le résultat peut être aléatoire.

SELECT * FROM (SELECT _DATA.ID, ROW_NUMBER() over (order by _DATA.ID) _RN, COUNT(*) _COUNT FROM XX.srsshiptype _DATA ) WHERE _RN BETWEEN 1 and 1000

Bonjour,

J'aurai besoin d'un example de model où l'erreur arrive.

De plus, peux tu essayer de mettre à jour le driver db-api d'iris, nous avons récemment corrigé des problèmes par rapport aux TINYINT et aux streams.

pip install intersystems_iris@https://github.com/intersystems-community/intersystems-irispython/releases/download/3.7.3/intersystems_iris-3.7.3-py3-none-any.whl --upgrade

Sinon, tu peux toujours soumettre un bug sur l’interpréteur django pour iris ici:

https://github.com/caretdev/django-iris

Bonjour,

Je rencontre aussi ce problème, c'est lié à la version 2023.1 d'iris et pas à VsCode. La redirection des erreurs dans la sortie standard ne se fait pas systématiquement.

C'est résolu à partir de la 2023.3.

Un workaround :

Do$system.OBJ.SetQualifiers("/multicompile=0",1)

Cette commande désactive la compilation parallèle dans tout le système. Cela ne pose pas de problème si des classes individuelles sont compilées. Par contre, elle est plus lente pour de nombreuses classes. Mais vous pouvez le réactiver en utilisant le CompileFlag /multicompile=1 si vous devez compiler beaucoup de classes à la fois :

do$SYSTEM.OBJ.Compile("Demo.Demo","/multicompile=1",.err)

Je ne sais pas si VsCode support cette fonctionnalité, ce pendant, il est tout à fait possible d'ouvrir un ticket pour en faire une demande :

https://github.com/intersystems-community/vscode-objectscript/issues

J'imagine que ces propriétés sont liées aux objects projects qui aident aux déploiements.

Pour accéder aux options de projets il faut monter un dossier isfs qui fait la passerelle entre iris et vscode :

https://docs.intersystems.com/components/csp/docbook/DocBook.UI.Page.cls?KEY=GVSCO_project

Bonjour,

C'est la connexion sqlalchemy qui creer une transaction qui n'est jamais relâchée, le code suivant devrait fonctionner:

ClassMethod creerFichierCSV(
	query As%String,
	filename As%String) [ Language = python ]
{
    import pandas as pd
    from sqlalchemy import create_engine,text
    engine = create_engine('iris+emb:///')try:
        df = pd.read_sql(text("SELECT * from Ens_Util.Log"),engine)
    except Exception as e:
        raise e
    finally:
        engine.dispose()

    df.to_csv("toto", index=False, header = True, encoding='utf-8', sep =';')return
}

Pour relâcher la transaction, aller dans :

Puis selection la transaction :

et enfin, la terminer :

Bonjour,

La facon, la plus simple aujourd'hui est de passer par du code Python ou Java pour ce genre d'opération :

Ou encore utiliser le super module d'interopérabilité 100% python :

effectivement, il y a un problem de lock avec SQLAlchmy et embedded python.

ce que tu proposes, c'est de passer d'une connexion SQLAlchmy avec EmbeddedPython vers une connexion classique sur TCP/IP.

Pourquoi cela ne fonctionnerait pas en production ?

Tu as à variabiliser les login et mot de passe et le tour est joué.

L'adresse du server ne doit pas changer, ca sera toujours localhost dans ton cas.

autre solution est de forcer l'autoCommit lors de la création de l'engine avec embeddded python :

engine = create_engine('iris+emb:///', connect_args={'autoCommit': True})

Je viens d'en discuter avec le developpeur du driver SQLAlchemy, c'est un problème connu de SQLAlchemy avec EmbeddedPython, les transactions ne sont jamais relachées.

Un correctif arrivera bientot, d'ici là, une solution peut etre de forcer l'autoCommit:

engine = create_engine('iris+emb:///', connect_args={'autoCommit': True})

Je ne connais pas l'impact sur les performances, je pense qu'il est minime dans ton scénario.

Cependant, dans le cas d'insertion en batch (+100 000 d'un coup), je passerai peut etre pas d'autre méthode que SQLAlchemy que je ne connais pas tres bien, je ne sais pas par exemple si il support les methodes `executemany` de db-api.

Avant de rentrer dans ces considerations d'optimisation, faisons en sorte que le flux fonctionne ;)

Wow tant de récompenses ! Merci à tous les membres de la communauté qui ont contribué à ce succès. C'est un honneur de faire partie de cette communauté. Je suis très heureux de voir que les membres de notre communauté ont été récompensés pour leur travail acharné. Cela montre que nous sommes une communauté active et que nous avons beaucoup à offrir. Je suis impatient de voir ce que l'année prochaine nous réserve !

Dans mes souvenirs, c'est pas trivial d'activer le RBAC pour Kong car on a vite fait de se retrouver à l’extérieur de la maison sans les clés.

Il y a quelques temps, j'ai créé un tuto sur Kong avec une procedure pour creer un utilisateur admin, l'idée c'est de créer le compte admin avant de forcer l'RBAC :

https://github.com/grongierisc/kong-ee-training?tab=readme-ov-file#10-secure-management-portal

J'espere que cette procédure est toujours valide avec la version 3.4

Ok, effectivement, les choses semblent avoir changées.

D'apres la doc kong : https://docs.konghq.com/gateway/latest/kong-manager/auth/super-admin/#create-a-super-admin

Lors de la migration de kong, tu dois passer le paramètre : KONG_PASSWORD

Activer le RBAC : KONG_ENFORCE_RBAC: 'on'

Et te connecter avec :

Login : kong_admin et Mot de passe : Celui spécifié dans la migration

Après tu dois avoir accès au bouton Invite Admin